pythonで特定の期間(start, end)が与えられた際に、月毎にグループ分けを行いたいです。
具体的には、1/15 - 3/3という期間が与えられた場合には、
1/15 - 1/31, 2/1 - 2/28, 3/1 - 3/3という形でグループ分けしたいです。

とりあえず下記のコードで実現はできましたが、下記の2点から良い方法、シンプルな方法があるのではないかと考えております。

  1. グループ分けを行える関数がありそう(itertools.groupbyをうまくつかう?)
  2. 前月の最終日を求める所が冗長

改善点等ありましたら教えてください。

from datetime import datetime, timedelta, date
from dateutil.relativedelta import relativedelta
def hoge(start, end):
    def _hoge(l, s, e):
        one_month_after = s + relativedelta(months=1)
        next_month = date(one_month_after.year, one_month_after.month, 1)
        month_last_day = next_month - timedelta(days=1)
        if e <= month_last_day:
            l.append((s, e))
            return l
        l.append((s, month_last_day))
        return _hoge(l, next_month, e)
    return _hoge([], start, end)

hoge(date(2019, 1, 15), date(2019, 3, 3))

出力

# [(datetime.date(2019, 1, 15), datetime.date(2019, 1, 31)),
#  (datetime.date(2019, 2, 1), datetime.date(2019, 2, 28)),
#  (datetime.date(2019, 3, 1), datetime.date(2019, 3, 3))]