from random import randrange
from collections import namedtuple
from datetime import datetime
class Period(namedtuple('Period', ['dt_start', 'dt_end'])):
def __str__(self):
if self.one_day:
return str(self.dt_start)
return "{!s}–{!s}".format(self.dt_start, self.dt_end)
@property
def one_day(self):
return self.dt_start.date() == self.dt_end.date()
def periods(dates):
dates = sorted(dates)
start = prev = dates[0]
for date in dates:
if (date - prev).days > 1:
yield Period(start, prev)
start = date
prev = date
yield Period(start, prev)
if __name__ == '__main__':
for period in periods(datetime(2016, 10, day) for day in (randrange(1, 31) for _ in range(20))):
print(period)
ZnJvbSByYW5kb20gaW1wb3J0IHJhbmRyYW5nZQpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCgoKY2xhc3MgUGVyaW9kKG5hbWVkdHVwbGUoJ1BlcmlvZCcsIFsnZHRfc3RhcnQnLCAnZHRfZW5kJ10pKToKCWRlZiBfX3N0cl9fKHNlbGYpOgoJCWlmIHNlbGYub25lX2RheToKCQkJcmV0dXJuIHN0cihzZWxmLmR0X3N0YXJ0KQoJCXJldHVybiAieyFzfeKAk3shc30iLmZvcm1hdChzZWxmLmR0X3N0YXJ0LCBzZWxmLmR0X2VuZCkKCQoJQHByb3BlcnR5CglkZWYgb25lX2RheShzZWxmKToKCQlyZXR1cm4gc2VsZi5kdF9zdGFydC5kYXRlKCkgPT0gc2VsZi5kdF9lbmQuZGF0ZSgpCgkJCgpkZWYgcGVyaW9kcyhkYXRlcyk6CglkYXRlcyA9IHNvcnRlZChkYXRlcykKCXN0YXJ0ID0gcHJldiA9IGRhdGVzWzBdCglmb3IgZGF0ZSBpbiBkYXRlczoKCQlpZiAoZGF0ZSAtIHByZXYpLmRheXMgPiAxOgoJCQl5aWVsZCBQZXJpb2Qoc3RhcnQsIHByZXYpCgkJCXN0YXJ0ID0gZGF0ZQoJCXByZXYgPSBkYXRlCgl5aWVsZCBQZXJpb2Qoc3RhcnQsIHByZXYpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoJCglmb3IgcGVyaW9kIGluIHBlcmlvZHMoZGF0ZXRpbWUoMjAxNiwgMTAsIGRheSkgZm9yIGRheSBpbiAocmFuZHJhbmdlKDEsIDMxKSBmb3IgXyBpbiByYW5nZSgyMCkpKToKCQlwcmludChwZXJpb2QpCg==