[英]Group list of objects based on close datetime attribute
說我有一個對象列表。 每個都有一個代表日期的字符串(可由dateutil解析)。 如何將它們分組到一個列表列表中,其中每個子列表包含連續的對象(在5分鍾之內)? 例如:
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)
此時list2將是
[[o1,o2,o3],[o4]]
似乎應該有一個使用lambdas或itertools以及dateutil的python解決方案,但是我的Google學校讓我失敗了。
謝謝!
看一下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)
看一下這個問題,找出如何舍入日期時間: 如何舍入日期時間對象python的分鍾
我以前的答案不能完全解決問題。 您希望將相互之間少於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)]
其余的應該很容易
這是生成連續對象組的生成器:
import datetime
import dateutil.parser
five_minutes = datetime.timedelta(minutes=5)
def group_by_time(objects):
objects = iter(objects)
obj = next(objects)
last = dateutil.parser.parse(obj.time)
group = [obj]
for obj in objects:
time = dateutil.parser.parse(obj.time)
if time > last + five_minutes:
yield group
group = []
group.append(obj)
last = time
else:
yield group
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.