Как найти два близких события (которые имеют компонент datetime) в python

У меня есть объект, который представляет событие, и у меня есть много типов этих объектов.

Я хочу найти события, которые близки по времени в Python.

Самый хороший способ, которым я мог бы найти это:

joined_events = [[event_a.time, event_a.description, event_b.time, event_b.description] for event_a in events_a for event_b in events_b if abs(event_a.time - event_b.time) < datetime.timedelta(hours = 1)]

Но я надеялся, что есть лучший способ сделать это.

2 ответа

Решение

Я не мог найти лучшее решение, поэтому я написал одно:

https://github.com/tomirendo/Grouper

Его основное назначение - сгруппировать объекты по их отношению и заменить функцию itertools.groupby.

import datetime,random,Grouper
groups_of_dates = Grouper.groupby(list_of_dates,relation= Grouper.time_delta(hours = 3),as_iterable=False)
#Get a list of lists, grouping 
#consecutive events that are less than 3 hours apart.

Чтобы решить мою проблему, вы можете сделать это:

results = [[a,b] 
         for a,b in itertools.product(events_a ,events_b)
         if Grouper.time_delta(attr="time",hours = 3)(a,b)]

Для более общего решения вы можете использовать AND,OR и разностные методы:

groups_of_dates = Grouper.groupby(list_of_dates,
                    relation= Grouper.AND(Grouper.time_delta(hours = 3),
                               Grouper.difference(3,attr="loc")),
                    as_iterable=False)

Красота в глазах смотрящего, но, надеюсь, она немного менее уродлива:)

import datetime
from itertools import product

delta = datetime.timedelta(hours=1)
joined_events = [
    [a.time, a.description, b.time, b.description]
    for a, b in product(events_a, events_b) if abs(a.time - b.time) < delta
]
Другие вопросы по тегам