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_date
和 end_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-01
或 2021-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')
我想根据任意两个日期生成日期范围。例如:
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_date
和 end_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-01
或 2021-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')