Skip to content

Instantly share code, notes, and snippets.

@mattes
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattes/8987332 to your computer and use it in GitHub Desktop.
Save mattes/8987332 to your computer and use it in GitHub Desktop.
from datetime import datetime, timedelta
def parse_date_ranges(dates):
if(not dates or not len(dates) > 0):
return False
# make sure to order dates
dates.sort()
# init values
result = []
tupl = [dates[0], dates[0]]
it = iter(dates)
date = True
def add_tuple_to_result(tuple):
# if first part of tuple differs from last part -> add full tuple
# else -> add first part of tuple only
result.append(tupl if tupl[0] != tupl[1] else tupl[0])
while date:
# get next date or False if no next date
date = next(it, False)
# filter double dates
if(date in tupl):
continue
elif(date):
if(date - timedelta(days=1) == tupl[1]):
# consecutive date, so add date to end of current tuple
tupl[1] = date
else:
# gap larger than 1 day: add current tuple to result
# and create new tuple
add_tuple_to_result(tupl)
tupl = [date, date]
else:
# date == false, so this is the last step.
# add the current tuple to result
add_tuple_to_result(tupl)
return result
dates = [
datetime(2014, 10, 11),
datetime(2014, 10, 1),
datetime(2014, 10, 2),
datetime(2014, 10, 3),
datetime(2014, 10, 5),
datetime(2014, 10, 5),
datetime(2014, 10, 6),
datetime(2014, 10, 22),
datetime(2014, 10, 20),
datetime(2014, 10, 21),
datetime(2014, 10, 9),
datetime(2014, 10, 7),
datetime(2014, 10, 6)
]
expect = [
[datetime(2014, 10, 1), datetime(2014, 10, 3)],
[datetime(2014, 10, 5), datetime(2014, 10, 7)],
datetime(2014, 10, 9),
datetime(2014, 10, 11),
[datetime(2014, 10, 20), datetime(2014, 10, 22)]
]
result = parse_date_ranges(dates)
print result == expect
dates.sort(reverse=True)
result = parse_date_ranges(dates)
print result == expect
dates = []
result = parse_date_ranges(dates)
print result == False
dates = [datetime(2014, 10, 6)]
result = parse_date_ranges(dates)
print result == [datetime(2014, 10, 6)]
dates = [datetime(2014, 10, 6), datetime(2014, 10, 5)]
result = parse_date_ranges(dates)
print result == [[datetime(2014, 10, 5), datetime(2014, 10, 6)]]
dates = [datetime(2014, 10, 6), datetime(2014, 10, 5), datetime(2014, 10, 7)]
result = parse_date_ranges(dates)
print result == [[datetime(2014, 10, 5), datetime(2014, 10, 7)]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment