如何对不规则时间戳列表进行重采样/下采样?
How to resample / downsample an irregular timestamp list?
一个简单的问题,但我找不到简单的答案。
我有一个数据列表,以秒为单位计算事件发生的时间:
[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..]
如有任何帮助,我们将不胜感激。
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 应包含一天的活动。
采样行为意味着在某些离散时间 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'
将进入您的输出列表,这是按每小时事件数计算的。
问题有 scipy
标签,scipy
取决于 numpy
,所以我假设使用 numpy
的答案是可以接受的。
要获取与时间戳 t
关联的小时,您可以取 t/3600
的整数部分。然后,要获得每个小时的事件数,您可以统计这些整数出现的次数。 numpy 函数 bincount
可以为您做到这一点。
这是用于计算的单行代码。我把时间戳放在一个 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])
一个简单的问题,但我找不到简单的答案。
我有一个数据列表,以秒为单位计算事件发生的时间:
[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..]
如有任何帮助,我们将不胜感激。
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 应包含一天的活动。
采样行为意味着在某些离散时间 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'
将进入您的输出列表,这是按每小时事件数计算的。
问题有 scipy
标签,scipy
取决于 numpy
,所以我假设使用 numpy
的答案是可以接受的。
要获取与时间戳 t
关联的小时,您可以取 t/3600
的整数部分。然后,要获得每个小时的事件数,您可以统计这些整数出现的次数。 numpy 函数 bincount
可以为您做到这一点。
这是用于计算的单行代码。我把时间戳放在一个 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])