从一对日期中,我想创建一个按月频率的日期列表,包括所示两个日期的月份。
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]
DatetimeIndex(['2022-01-31', '2022-02-28', '2022-03-31'], dtype='datetime64[ns]', freq='M')
[january, february, mars, april]
如果现在我们运行:
pd.date_range("2022-01-13", "2022-04-05", freq='M', inclusive='right')
我们仍然得到和以前相同的结果。看起来inclusive对结果没有影响。
inclusive
Pandas 版本。1.5.3
MonthEnd
Day
这是因为 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]')