【问题标题】:How to resample / downsample an irregular timestamp list?如何重新采样/下采样不规则的时间戳列表?
【发布时间】:2015-04-10 09:44:15
【问题描述】:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas scipy resampling downsampling


    【解决方案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:”“1:”部分?
    【解决方案2】:

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

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

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

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

    n' = m * 3600 / T

    上面的n' 将进入您的输出列表,这将按每小时的事件进行缩放。

    【讨论】:

    • 谢谢,这是非常有用的信息。我没有意识到计数为 0 会被归类为上采样!
    【解决方案3】:

    这个问题有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])
    

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 2013-03-03
      • 1970-01-01
      • 2019-10-10
      • 2022-11-13
      • 2018-08-17
      • 2020-07-10
      • 2014-03-19
      • 1970-01-01
      相关资源
      最近更新 更多