2015-02-10 84 views
3

简单的问题,但我一直没能找到一个简单的答案。如何重新采样/下采样不规则的时间戳列表?

我有数据列表,计数的时间在事件发生秒:

[200.0 420.0 560.0 1100.0 1900.0 2700.0 3400.0 3900.0 4234.2 4800.0 etc..] 

我希望把很多事件是如何发生的每一个小时(3600秒),并创建这些计数的一个新的列表。

我明白这叫做下采样,但我能找到的所有信息都与传统的时间序列有关。

对于上述新列表的例子看起来像:

[7 3 etc..] 

任何帮助将不胜感激。

回答

1
all_events = [ 
    200.0, 420.0, 560.0, 1100.0, 1900.0, 2700.0, 3400.0, 3900.0, 4234.2, 4800.0] 

def get_events_by_hour(all_events): 
    return [ 
     len([x for x in all_events if int(x/3600.0) == hour]) 
     for hour in xrange(24) 
    ] 

print get_events_by_hour(all_events) 

请注意,all_events应该包含一天的事件。

+0

大,感谢您的帮助。任何方法去除输出中的小时标记,即输出的“0:”“1:”部分? – bobo 2015-02-10 11:47:41

+0

好的,我编辑了答案。 – 2015-02-10 11:48:43

+0

非常感谢。 – bobo 2015-02-10 11:54:17

1

取样行为是指在某些离散时间取数据f_i(样本)t_i。 每时间单位的采样数量给出采样率。下采样是重采样的一种特殊情况,这意味着将采样数据映射到不同的采样点集合t_i',这里采样率较小的一个采样点,使采样更粗糙。

你的第一列表包含采样点t_i(单位是秒),并间接对应于索引i,例如n_i = i + 1事件n_i的数量。

如果您偶尔减少列表一次,在定期时间T(单位是秒)之后,您将在t_i' = i * T时间重新采样到一个新集合n_i'。 我没有写下采样,因为在T时间内没有任何可能发生,这意味着上采样,因为你现在需要更多的数据点。

为了计算您检查输入列表是否为空,在这种情况下n' = 0应该进入您的输出列表。 否则,你在你的输入列表m项,随着时间的推移T测量,你可以用下面的公式:

n' = m * 3600/T

以上n'将进入你的输出列表,这是扩展到每小时事件。

+0

谢谢你真的有用的信息。我没有意识到0的计数将被归类为上采样! – bobo 2015-02-10 11:53:38

1

问题有scipy标记,而scipy取决于numpy,所以我假设使用numpy的答案是可以接受的。

要获得与时间戳t相关的小时数,您可以采用整数部分t/3600。然后,要获取每小时的事件数量,可以计算这些整数的出现次数。 numpy功能bincount可以为你做到这一点。

这里是一个numpy单线计算。我把时间戳在numpy的阵列t

In [49]: t = numpy.array([200.0, 420.0, 560.0, 1100.0, 1900.0, 2700.0, 3400.0, 3900.0, 4234.2, 4800.0, 8300.0, 8400.0, 9500.0, 10000.0, 14321.0, 15999.0, 16789.0, 17000.0]) 

In [50]: t 
Out[50]: 
array([ 200. , 420. , 560. , 1100. , 1900. , 2700. , 
     3400. , 3900. , 4234.2, 4800. , 8300. , 8400. , 
     9500. , 10000. , 14321. , 15999. , 16789. , 17000. ]) 

这是你的计算:

In [51]: numpy.bincount((t/3600).astype(int)) 
Out[51]: array([7, 3, 4, 1, 3])