~ 2 min read
Splitting a date range in Python
Dates are one of those annoying things that shouldn’t be, but are regularly difficult in web apps. I used the following two methods in a recent page to neatly break a date range into distinct segments as part of a analytics app I’m currently working on. Hopefully someone else will find them helpful.
import datetime, calendar
# Find the delta between two dates based on a desired number of ranges
def datedelta(startdate, enddate, no_of_ranges):
start_epoch = calendar.timegm(startdate.timetuple())
end_epoch = calendar.timegm(enddate.timetuple())
date_diff = end_epoch - start_epoch
step = date_diff / no_of_ranges
return datetime.timedelta(seconds=step)
date_delta allows me to create the timedeltas between two dates based on a desired number of segments.
# Edit 18/07/2014 - I realised dates needed the hrs, mins an secs correctly
# adjusted to beginning / end of day
def datespan(startdate, enddate, delta=datetime.timedelta(days=1)):
currentdate = startdate
while currentdate + delta < enddate:
todate = (currentdate + delta).replace(hour=23, minute=59,second=59)
yield currentdate, todate
currentdate += delta
currentdate.replace(hour=0, minute=0,second=0)
I can then pass the delta into datespan above, which returns an iterable I can then use.
# Get timedeltas based on splitting the range by 10
delta = date_delta(startdate, enddate, 10)
for from_datetime, to_datetime in datespan(startdate, enddate, delta):
print from_datetime, to_datetime
The result forms part of the following d3 chart:
Made some updates to that there commerce dashboard (now uses summary ranges on x-axis), what do people think? pic.twitter.com/AatFxBRnsC
— Ian Wootten (@iwootten) June 25, 2014