如何重新采样/下采样不规则的时间戳列表?

时间:2015-02-10 11:17:47

标签: python pandas scipy resampling downsampling

简单的问题,但我找不到简单的答案。

我有一个数据列表,用于计算事件发生的时间(以秒为单位):

[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..]

非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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应包含一天的事件。

答案 1 :(得分:1)

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

您的第一个列表包含示例点t_i(单位为秒),间接包含与索引n_i对应的事件数i,例如n_i = i + 1

如果您偶尔缩小列表,经过一段时间T(单位为秒)后,您将重新采样到n_i'的新集t_i' = i * T。 我没有写下采样,因为在T的时间内没有任何事情可能发生,这意味着上采样,因为你现在需要更多的数据点。

对于计算,您检查输入列表是否为空,在这种情况下n' = 0应该进入输出列表。 否则,您的输入列表中会有m个条目,并且会随时间T进行衡量,您可以使用以下公式:

n' = m * 3600 / T

以上n'会进入您的输出列表,这会缩放到每小时的事件。

答案 2 :(得分: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])