簡體   English   中英

基於關閉日期時間屬性的對象分組列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM