fork(1) download
  1. from random import randrange
  2. from collections import namedtuple
  3. from datetime import datetime
  4.  
  5.  
  6. class Period(namedtuple('Period', ['dt_start', 'dt_end'])):
  7. def __str__(self):
  8. if self.one_day:
  9. return str(self.dt_start)
  10. return "{!s}–{!s}".format(self.dt_start, self.dt_end)
  11.  
  12. @property
  13. def one_day(self):
  14. return self.dt_start.date() == self.dt_end.date()
  15.  
  16.  
  17. def periods(dates):
  18. dates = sorted(dates)
  19. start = prev = dates[0]
  20. for date in dates:
  21. if (date - prev).days > 1:
  22. yield Period(start, prev)
  23. start = date
  24. prev = date
  25. yield Period(start, prev)
  26.  
  27.  
  28. if __name__ == '__main__':
  29. for period in periods(datetime(2016, 10, day) for day in (randrange(1, 31) for _ in range(20))):
  30. print(period)
  31.  
Success #stdin #stdout 0.02s 13080KB
stdin
Standard input is empty
stdout
2016-10-01 00:00:00
2016-10-03 00:00:00
2016-10-05 00:00:00–2016-10-06 00:00:00
2016-10-08 00:00:00–2016-10-09 00:00:00
2016-10-13 00:00:00
2016-10-15 00:00:00–2016-10-17 00:00:00
2016-10-20 00:00:00
2016-10-27 00:00:00–2016-10-30 00:00:00