基于关闭日期时间属性的对象组列表

时间:2016-03-03 07:44:20

标签: python

说我有一个对象列表。其中每个都有一个表示日期的字符串(可由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解决方案,但我的谷歌学校让我失望。

谢谢!

3 个答案:

答案 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