如何包含pandas date_range()的两个端点

3
从一对日期中,我想创建一个按月频率列出的日期列表,包括所指示的两个日期的月份。
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):[1月, 2月, 3月, 4月]

如果现在我们运行:

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

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

Pandas 版本:1.5.3

2个回答

2

使用MonthEndDay偏移量

这是因为2022年4月5日在您的月底(2022年4月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')

替代方案:使用{{link1: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]')

1
谢谢@mozway!这解决了问题。我不知道pd.offsets.MonthEnd() - Simon
1
@Simon 注意,如果输入值已经是月底,这将跳到下个月。一个技巧可能是使用 pd.date_range("2022-01-13", pd.Timestamp("2022-04-05")-pd.offsets.Day()+pd.offsets.MonthEnd(), freq='M', inclusive='both') - mozway
1
我添加了另一种带有句点的方法。 - mozway

0
这是因为如果使用Day,则会看到差异,这是由于Month的定义。当您按月计算时,没有影响。
对于包含: both:a <= x <= b(在数学约定中:[a,b]neither:a < x < b(在数学约定中:]a,b[right:a < x <= b(在数学约定中:]a,b]left:a <= x < b(在数学约定中:[a,b[您不能超出限制范围

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接