很简单的问题,但我还没能找到一个简单的答案。我有一个数据列表,它以秒为单位计算事件发生的时间:
[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..]
任何帮助都将不胜感激。
yqkkidmi1#
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应包含一天的事件。
enxuqcxy2#
采样是指在特定的离散时间t_i上采集数据f_i(样本)。每个时间单位的样本数给出了采样率。下采样是重采样的一种特殊情况,它意味着将采样的数据Map到不同的采样点集t_i'上,这里是Map到采样率更小的采样点上,使样本更粗糙。您的第一个列表包含采样点t_i(单位为秒),并间接包含与索引i对应的事件数n_i,例如n_i = i + 1。如果你偶尔减少列表,在周期性的时间T(单位是秒)之后,你会在时间t_i' = i * T重新采样到一个新的集合n_i'。我没有写下采样,因为在时间T内可能什么都没有发生,这意味着上采样,因为你现在需要更多的数据点。对于计算,检查输入列表是否为空,如果是,则n' = 0应进入输出列表。否则,输入列表中有m项,随时间测量T,可以使用以下等式:n' = m * 3600 / T个上面的n'将进入您的输出列表,这是按每小时事件数缩放的。
t_i
f_i
t_i'
i
n_i
n_i = i + 1
T
t_i' = i * T
n_i'
n' = 0
m
n' = m * 3600 / T
n'
2admgd593#
这个问题有scipy标记,而scipy依赖于numpy,所以我假设使用numpy的答案是可以接受的。要获得与时间戳t相关的小时数,可以取t/3600的整数部分。然后,要获得每个小时内的事件数,可以计算这些整数出现的次数。numpy函数bincount可以为您完成此操作。下面是一个用于计算的简单的一行程序。我把时间戳放在一个简单的数组t中:
scipy
numpy
t
t/3600
bincount
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])
3条答案
按热度按时间yqkkidmi1#
请注意,all_events应包含一天的事件。
enxuqcxy2#
采样是指在特定的离散时间
t_i
上采集数据f_i
(样本)。每个时间单位的样本数给出了采样率。下采样是重采样的一种特殊情况,它意味着将采样的数据Map到不同的采样点集t_i'
上,这里是Map到采样率更小的采样点上,使样本更粗糙。您的第一个列表包含采样点
t_i
(单位为秒),并间接包含与索引i
对应的事件数n_i
,例如n_i = i + 1
。如果你偶尔减少列表,在周期性的时间
T
(单位是秒)之后,你会在时间t_i' = i * T
重新采样到一个新的集合n_i'
。我没有写下采样,因为在时间T
内可能什么都没有发生,这意味着上采样,因为你现在需要更多的数据点。对于计算,检查输入列表是否为空,如果是,则
n' = 0
应进入输出列表。否则,输入列表中有m
项,随时间测量T
,可以使用以下等式:n' = m * 3600 / T
个上面的
n'
将进入您的输出列表,这是按每小时事件数缩放的。2admgd593#
这个问题有
scipy
标记,而scipy
依赖于numpy
,所以我假设使用numpy
的答案是可以接受的。要获得与时间戳
t
相关的小时数,可以取t/3600
的整数部分。然后,要获得每个小时内的事件数,可以计算这些整数出现的次数。numpy函数bincount
可以为您完成此操作。下面是一个用于计算的简单的一行程序。我把时间戳放在一个简单的数组
t
中:计算结果如下: