Когда вы не работаете с Python3 еще и, следовательно, не может использовать память эффективных range
объектов, вы могли бы сделать namedtuple, как показано на the answer you link to (иначе вы могли бы точно также использовать новые range
объекты). Оттуда, все, что вам нужно сделать, это использовать datetime.date.fromordinal
на перекрывающей DATERANGE:
>>> from datetime import date
>>> from collections import namedtuple
>>> Range = namedtuple('Range', ['start', 'end'])
>>> r1 = Range(start=date(2016, 1, 1), end=date(2016, 2, 5))
>>> r2 = Range(start=date(2016, 1, 28), end=date(2016, 2, 28))
>>> latest_start = max(r1.start, r2.start)
>>> earliest_end = min(r1.end, r2.end)
>>> overlap = (earliest_end - latest_start).days + 1
>>> overlapping_dates = [] # default
>>> if overlap > 0:
... overlapping_dates = range(latest_start.toordinal(), earliest_end.toordinal() + 1) # as numbers
... overlapping_dates = [ date.fromordinal(x) for x in overlapping_dates ] # back to datetime.date objects
...
>>> overlapping_dates
[datetime.date(2016, 1, 28),
datetime.date(2016, 1, 29),
datetime.date(2016, 1, 30),
datetime.date(2016, 1, 31),
datetime.date(2016, 2, 1),
datetime.date(2016, 2, 2),
datetime.date(2016, 2, 3),
datetime.date(2016, 2, 4),
datetime.date(2016, 2, 5)]
Подход с использованием set
тоже будет работать (один из этих подходов в истории редактирования этого ответа), но, как правило, менее эффективен, потому что он должен иметь все даты в памяти, даже те, которые не находятся на перекрестке.
Thanks Kardaj! просто интересно о части производительности, почему кастинг в строку улучшит производительность? – tkyass
Поскольку в случае, когда вы собираетесь генерировать много дат, вы предпочитаете хранить менее сложную структуру данных, такую как строка, которая для этого случая не приведет к потере информации. – kardaj