Last active
August 29, 2015 13:56
-
-
Save mattes/8987332 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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