Как найти два близких события (которые имеют компонент 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
]