I have a list of dates, for example:
['2011-02-27', '2011-02-28', '2011-03-01', '2011-04-12', '2011-04-13', '2011-06-08']
How do I find the contiguous date ranges contained within those dates? In the above example, the ranges should be:
[{"start_date": '2011-02-27', "end_date": '2011-03-01'}, {"start_date": '2011-04-12', "end_date": '2011-04-13'}, {"start_date": '2011-06-08', "end_date": '2011-06-08'} ]
Thanks.
Advertisement
Answer
This works, but I’m not happy with it, will work on a cleaner solution an edit the answer. Done, here is a clean, working solution:
import datetime import pprint def parse(date): return datetime.date(*[int(i) for i in date.split('-')]) def get_ranges(dates): while dates: end = 1 try: while dates[end] - dates[end - 1] == datetime.timedelta(days=1): end += 1 except IndexError: pass yield { 'start-date': dates[0], 'end-date': dates[end-1] } dates = dates[end:] dates = [ '2011-02-27', '2011-02-28', '2011-03-01', '2011-04-12', '2011-04-13', '2011-06-08' ] # Parse each date and convert it to a date object. Also ensure the dates # are sorted, you can remove 'sorted' if you don't need it dates = sorted([parse(d) for d in dates]) pprint.pprint(list(get_ranges(dates)))
And the relative output:
[{'end-date': datetime.date(2011, 3, 1), 'start-date': datetime.date(2011, 2, 27)}, {'end-date': datetime.date(2011, 4, 13), 'start-date': datetime.date(2011, 4, 12)}, {'end-date': datetime.date(2011, 6, 8), 'start-date': datetime.date(2011, 6, 8)}]