我有一个以毫秒为准确间隔发生的事件列表,跨越几天。我想将发生在“每 n 分钟”时段中的所有事件(可以是 20 个事件,也可以是没有事件)进行聚类。我为每个事件都有一个 datetime.datetime 项,所以我可以毫无困难地获得 datetime.datetime.minute

我的事件列表按时间顺序排序,最早在前,最后在后。该列表在我正在研究的时间段内是完整的。

我的想法是我可以更改列表:-

[[a],[b],[c],[d],[e],[f],[g],[h],[i]...]

其中 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]]...]

我不确定如何构建一个循环遍历两个时隙直到时间序列列表结束的迭代器。我能想到的所有使用xrange的操作都会在完成后停止,因此我想知道是否存在一种使用“while”进行切片的方法?

我还将使用较小的时间段,可能是 5 分钟,我使用 30 分钟作为演示的较短示例。

(对于上下文,我正在制作新西兰最近地震的基于地理绘制的时间 View 。并希望一步显示一小段时间内发生的所有地震以加快回放速度)

最佳答案

# 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

这是 this 答案的 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):
    ...

关于Python:将数天的数据分组为时隙(分钟),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17851412/

10-15 21:06