小能豆

如何包含 pandas date_range() 的两端

py

从一对日期中,我想创建一个按月频率的日期列表,包括所示两个日期的月份。

import pandas as pd
import datetime

# Option 1
pd.date_range(datetime(2022, 1, 13),datetime(2022, 4, 5), freq='M', inclusive='both')
# Option 2
pd.date_range("2022-01-13", "2022-04-05", freq='M', inclusive='both')

都返回列表:DatetimeIndex(['2022-01-31', '2022-02-28', '2022-03-31'], dtype='datetime64[ns]', freq='M')。但是,我期望结果是一个日期列表(4 个长),每个月一个日期:[january, february, mars, april]

如果现在我们运行:

pd.date_range("2022-01-13", "2022-04-05", freq='M', inclusive='right')

我们仍然得到和以前相同的结果。看起来inclusive对结果没有影响。

Pandas 版本。1.5.3


阅读 5

收藏
2024-11-04

共1个答案

小能豆

使用MonthEndDay偏移

这是因为 2022-04-05 在您的月底(2022-04-30)之前。

您可以使用:

pd.date_range("2022-01-13", pd.Timestamp("2022-04-05")+pd.offsets.MonthEnd(),
              freq='M', inclusive='both')

一个更强大的变体还可以处理输入日期已经是月末的情况:

pd.date_range("2022-01-13",
              pd.Timestamp("2022-04-05")-pd.offsets.Day()+pd.offsets.MonthEnd(),
              freq='M', inclusive='both')

输出:

DatetimeIndex(['2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30'],
              dtype='datetime64[ns]', freq='M')

替代方案:使用Period

pd.date_range(pd.Period('2022-01-13', 'M').to_timestamp(),
              pd.Period('2022-04-30', 'M').to_timestamp(how='end'),
              freq='M', inclusive='both')

中间体:

pd.Period('2022-01-13', 'M').to_timestamp()
# Timestamp('2022-01-01 00:00:00')

pd.Period('2022-04-30', 'M').to_timestamp(how='end')
# Timestamp('2022-04-30 23:59:59.999999999')

或句点形式:period_range

pd.period_range('2022-01-13', '2022-04-30', freq='M')

输出:

PeriodIndex(['2022-01', '2022-02', '2022-03', '2022-04'], dtype='period[M]')
2024-11-04