为什么将 CDay() 添加到 DatetimeIndex 包括周末?

Why does adding CDay() to DatetimeIndex include a weekend?

我正在使用 pandas 版本 1.1.3。

假设我有以下索引

import pandas as pd
from pandas.tseries.offsets import CDay

idx = pd.bdate_range("2010-02-03","2010-02-12") + pd.Timedelta('22H')

如果我再添加:

shifted_idx = idx + 0*CDay(offset=pd.Timedelta('4H'))

我希望 2010-05-05 22:00idx 中的时间戳移动到 2010-05-08 02:00,因为 CDay() 默认具有 weekmask = ‘Mon Tue Wed Thu Fri’

但是,我们在 shifted_idx 中看到一个时间戳 2010-02-06 02:00:00,它在星期六并且违反了周掩码?

通过键入 shifted_idx = idx + 0*CDay(offset=pd.Timedelta('4H')),您只需将 4h 添加到之前的时间戳,CDay 东西在那里不起作用。

执行正常 pd.date_range 并将四个小时添加到该范围并最终使用以下代码对数据帧进行切片要简单得多:

    import pandas as pd
    idx = pd.date_range("2010-02-03","2010-02-12") + pd.Timedelta('22H')
    shifted_idx = idx + pd.Timedelta('4H')
    shifted_idx = shifted_idx[shifted_idx.dayofweek < 5]

offset参数在应用白班之后应用,这就是您得到这些结果的原因。

您可以通过查看 CustomBusinessDay class 的 the source code of the apply method 来了解这一点。请注意 CDay 只是 CustomBusinessDay.

的别名

不确定这是否算作错误,因为您可以争辩说这是预期的行为。我找不到任何文件来支持或反对这一点。

目前,您可以先手动应用偏移,然后再应用遮罩来解决此问题。像这样:

idx_hours_offset = idx + pd.Timedelta('4H')                                          

shifted_idx = idx_hours_offset + 0*CDay()