Pandas 具有月份频率的日期范围

Pandas date range with month freqency

我想根据任意两个日期生成日期范围。例如:

start_date = "2021-01-15"
end_date = "2021-04-15"
pd.date_range(start_date, end_date, freq="M")

这导致 DatetimeIndex(['2021-01-31', '2021-02-28', '2021-03-31'], dtype='datetime64[ns]', freq='M')

我想更新它以获取所有月份,包括 start_dateend_date 中的月份。因此,我想得到类似 DatetimeIndex(['2021-01-31', '2021-02-28', '2021-03-31', '2021-04-30'], dtype='datetime64[ns]', freq='M') 的东西(注意 '2021-04-30' 因为四月出现在 end_date 中)。

我知道还有其他频率选项(例如 here),我可以尝试 freq="MS"(月份开始),其中包括最后一个月(四月),但第一个(一月)将不见了。

我理解 pd.date_range 总是关心天数,这是有道理的,但是因为这对我来说并不重要(我不关心天数,只关心月数,输出是否会无关紧要像 2021-01-012021-01-31 甚至 2021-01-11),我想知道是否有任何简单的解决方案可行?

如果仅使用月份,则使用 period_range

per = pd.period_range(start_date, end_date, freq="M")
print (per)
PeriodIndex(['2021-01', '2021-02', '2021-03', '2021-04'], dtype='period[M]', freq='M')

并且可以使用 PeriodIndex.to_timestamp with DatetimeIndex.normalize:

转换为日期时间
print (per.to_timestamp(how='end').normalize())
DatetimeIndex(['2021-01-31', '2021-02-28', '2021-03-31', '2021-04-30'],
               dtype='datetime64[ns]', freq='M')