我有一个以mS精确间隔发生的事件列表,这些事件跨越了几天.我想聚集在'每n分钟'时隙中发生的所有事件(可以是20个事件,可以是没有事件).我datetime.datetime为每个活动都有一个项目,所以我可以datetime.datetime.minute毫无困难地获得.
我的事件列表按时间顺序排序,最早的第一个,最后的最后一个.该列表在我正在处理的时间段内完成.
这个想法是我可以改变名单: -
[[a],[b],[c],[d],[e],[f],[g],[h],[i]...]
Run Code Online (Sandbox Code Playgroud)
其中a,b,c出现在分钟0和29之间,d,e,f,g出现在分钟30和59之间,0到29之间没有任何东西(下一个小时),h,i介于30到59之间......
进入新名单: -
[[[a],[b],[c]],[[d],[e],[f],[g]],[],[[h],[i]]...]
Run Code Online (Sandbox Code Playgroud)
我不确定如何构建一个遍历两个时隙的迭代器,直到时间序列列表结束.任何我能想到的东西xrange一旦完成就会停止,所以我想知道是否有一种方法可以使用'while'进行切片?
我也将使用一个较小的时间段,大约5分钟,我使用30分钟作为演示的较短的例子.
(就上下文而言,我正在根据新西兰最近的地震制作基于时间的地理视图.并希望在一小段时间内显示所有发生的地震,以加快重播速度)
# create sample data
from datetime import datetime, timedelta
d = datetime.now()
data = [d + timedelta(minutes=i) for i in xrange(100)]
# prepare and group the data
from itertools import groupby
def get_key(d):
# group by 30 minutes
k = d + timedelta(minutes=-(d.minute % 30))
return datetime(k.year, k.month, k.day, k.hour, k.minute, 0)
g = groupby(sorted(data), key=get_key)
# print data
for key, items in g:
print key
for item in items:
print '-', item
Run Code Online (Sandbox Code Playgroud)
这是这个答案的python翻译,它通过将日期时间四舍五入到下一个边界并将其用于分组来工作.
如果您确实需要可能的空组,可以使用此方法或类似方法添加它们:
def add_missing_empty_frames(g):
last_key = None
for key, items in g:
if last_key:
while (key-last_key).seconds > 30*60:
empty_key = last_key + timedelta(minutes=30)
yield (empty_key, [])
last_key = empty_key
yield (key, items)
last_key = key
for key, items in add_missing_empty_frames(g):
...
Run Code Online (Sandbox Code Playgroud)