说我有一个对象列表。其中每个都有一个表示日期的字符串(可由dateutil解析)。如何在列表列表中对这些组进行分组,其中每个子列表包含连续(在5分钟内)对象?例如:
otool
此时list2将是
o1.time = "2016-03-01 23:25:00-08:00"
o2.time = "2016-03-01 23:30:00-08:00"
o3.time = "2016-03-01 23:35:00-08:00"
o4.time = "2016-03-02 12:35:00-08:00"
list1 = [o1, o2, o3, o4]
list2 = group_by_time(list1)
似乎应该有一个使用lambdas或itertools以及dateutil的python解决方案,但我的谷歌学校让我失望。
谢谢!
答案 0 :(得分:3)
查看itertools的groupby函数。它采用对象列表并根据关键功能对它们进行分组。您的代码可能如下所示
from dateutil.parser import parse
from itertools import groupby
def rounded_date(item):
d = parse(item.time)
# round date
return d
grouped_items = groupby(items, keyfunc=rounded_date)
查看此问题,了解如何舍入日期时间:How to round the minute of a datetime object python
答案 1 :(得分:1)
我以前的回答并没有完全解决问题。您希望对彼此之间间隔少于5分钟的所有后续项目进行聚类。你可能会看到一些集群算法,但是通过一些简单的代码行,这个问题也可以得到解决。顺便说一下,有很多不同的方法,这只是一个:
from datetime import timedelta
timedeltas = [timedelta(0)]
for i in range(1, len(items)):
delta = parse(item[i].time) - parse(item[i-1].time)
timedeltas.add(delta)
split_indices = [i for i in range(0, len(deltas)) if timedeltas[i] > timedelta(minutes=5)]
其余的应该很容易
答案 2 :(得分:1)
这是一个产生连续对象组的生成器:
as.numeric