pythondatedate-range

Efficient date range overlap calculation?


I have two date ranges where each range is determined by a start and end date (obviously, datetime.date instances). The two ranges can overlap or not. I need the number of days of the overlap. Of course I can pre-fill two sets with all dates within both ranges and the perform a set intersection but this is possibly inefficient...is there a better way apart from another solution using a long if-elif section covering all cases?


Solution

  • Here is an example calculation:

    >>> from datetime import datetime
    >>> from collections import namedtuple
    >>> Range = namedtuple('Range', ['start', 'end'])
    
    >>> r1 = Range(start=datetime(2012, 1, 15), end=datetime(2012, 5, 10))
    >>> r2 = Range(start=datetime(2012, 3, 20), end=datetime(2012, 9, 15))
    >>> latest_start = max(r1.start, r2.start)
    >>> earliest_end = min(r1.end, r2.end)
    >>> delta = (earliest_end - latest_start).days + 1
    >>> overlap = max(0, delta)
    >>> overlap
    52