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.
import pandas from datetime import datetime, timedelta startDate = datetime(2022, 6, 1) endDate = datetime(2022, 6, 10) # Getting List of Days using pandas datesRange = pandas. date_range(startDate,endDate-timedelta(days=1),freq='d') print(datesRange);
We can get the dates between two dates with single method call using the dedicated datesUntil method of a LocalDate class. The datesUntill returns the sequentially ordered Stream of dates starting from the date object whose method is called to the date given as method argument.
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)}]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With