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