from datetime import datetime, timedelta from collections import Counter def date_range(start, end): if isinstance(start, datetime): start = start.date() if isinstance(end, datetime): end = end.date() delta = end - start for d in range(delta.days + 1): yield start + timedelta(days=d) return def weekdays_in_date_range(start, end): return Counter([d.isoweekday() for d in date_range(start, end)]) def dates_overlap(start, end, start2, end2): return start <= end2 and start2 <= end