🐍 Finding Consecutive Date Ranges

July 03, 2022 00:00 • Category: Code Bytes

Problem

Given a list of datetime objects, group them consecutive date ranges.

ie; 2022-01-01, 2022-01-02, 2022-01-04, 2022-01-05 would yield:

[ 2022-01-01, 2022-01-02 ], [ 2022-01-04, 2022-01-05 ]

Code

from typing import List
from datetime import datetime
from datetime import timedelta

def group_consecutive_dates(dates: List[datetime]) -> List[List[datetime]]:
    dates.sort()
    result = []
    current_group = [dates[0]]
    for i in range(1, len(dates)):
        if dates[i] == dates[i - 1] + timedelta(days=1):
            current_group.append(dates[i])
        else:
            result.append(current_group)
            current_group = [dates[i]]
    result.append(current_group)
    return result

Testing

dates = [
    datetime(2022, 1, 1),
    datetime(2022, 1, 2),
    datetime(2022, 1, 5),
    datetime(2022, 1, 6),
    datetime(2022, 1, 7),
    datetime(2022, 1, 8),
    datetime(2022, 1, 15),
    datetime(2022, 1, 16),
]

grouped_dates = group_consecutive_dates(dates)

Result

[[datetime.datetime(2022, 1, 1, 0, 0), datetime.datetime(2022, 1, 2, 0, 0)],
 [datetime.datetime(2022, 1, 4, 0, 0),
  datetime.datetime(2022, 1, 5, 0, 0),
  datetime.datetime(2022, 1, 6, 0, 0),
  datetime.datetime(2022, 1, 7, 0, 0),
  datetime.datetime(2022, 1, 8, 0, 0)],
 [datetime.datetime(2022, 1, 15, 0, 0), datetime.datetime(2022, 1, 16, 0, 0)]]