pythonlistdatetimedateperiod

Generate a list of datetimes between an interval


Given two datetimes (start_date and end_date), I'd like to generate a list of other datetimes between these two dates, the new datetimes being separated by a variable interval. e.g. every 4 days between 2011-10-10 and 2011-12-12 or every 8 hours between now and tomorrow 19p.m.

Maybe something roughly equivalent to the Dateperiod PHP class.

What would be the most efficient way to accomplish this in Python?


Solution

  • Use datetime.timedelta:

    from datetime import date, datetime, timedelta
    
    def perdelta(start, end, delta):
        curr = start
        while curr < end:
            yield curr
            curr += delta
    
    >>> for result in perdelta(date(2011, 10, 10), date(2011, 12, 12), timedelta(days=4)):
    ...     print result
    ...
    2011-10-10
    2011-10-14
    2011-10-18
    2011-10-22
    2011-10-26
    2011-10-30
    2011-11-03
    2011-11-07
    2011-11-11
    2011-11-15
    2011-11-19
    2011-11-23
    2011-11-27
    2011-12-01
    2011-12-05
    2011-12-09
    

    Works for both dates and datetime objects. Your second example:

    >>> for result in perdelta(datetime.now(),
    ...         datetime.now().replace(hour=19) + timedelta(days=1),
    ...         timedelta(hours=8)):
    ...     print result
    ... 
    2012-05-21 17:25:47.668022
    2012-05-22 01:25:47.668022
    2012-05-22 09:25:47.668022
    2012-05-22 17:25:47.668022