Range = namedtuple('Range', ['start', 'end'])
r1 = Range(start=date(2016, 1, 1), end=date(2016, 2, 5))
r2 = Range(start=date(2016, 1, 28), end=date(2016, 2, 28))
latest_start = max(r1.start, r2.start)
earliest_end = min(r1.end, r2.end)
overlap = (earliest_end - latest_start).days + 1
overlapping_dates = []
if overlap > 0:
    overlapping_dates = list(range(latest_start.toordinal(), earliest_end.
        toordinal() + 1))
overlapping_dates = [date.fromordinal(x) for x in overlapping_dates]
overlapping_dates
перекрывающиеся даты между двумя диапазонами дат в python