Python Pandas – 检查BusinessDay偏移量是否已归一化
Pandas 是 Python 的一个开源数据分析库,提供了高性能、易用性以及数据清洗、聚合、分析等操作的能力。Pandas 中的 BusinessDay 偏移量中文名为“工作日”,常用于一些需要排除周末或者特定日期的操作。
在使用 BusinessDay 偏移量的时候有一个问题需要特别注意,就是它是否已经归一化了。什么是归一化呢?如果一个 BusinessDay 偏移量的结果是 3 个工作日,而第一个日期为周五,那么结果应该是下一个周四,而不是下一个周一。
本文就要教大家如何检查 BusinessDay 偏移量是否已经归一化。
更多Pandas相关文章,请阅读:Pandas 教程
检查方法
我们可以通过生成一个 DatetimeIndex 的方式来检查 BusinessDay 偏移量是否已经归一化。具体代码如下:
import pandas as pd
rng = pd.date_range('2022-09-01', '2022-09-07', freq='B')
print(rng)
上面的代码中我们生成了一个 2022 年 9 月 1 日至 2022 年 9 月 7 日之间的 DatetimeIndex,这里的 freq 参数为 ‘B’,表示使用 BusinessDay 偏移量,这个偏移量会将周末排除掉。
执行上面的代码会得到 5 个日期:
DatetimeIndex(['2022-09-01', '2022-09-02', '2022-09-05', '2022-09-06','2022-09-07'],dtype='datetime64[ns]', freq='B')
可以看到,这个列表中排除了周六和周日,只留下了 5 个日期。如果我们想要检查这个 BusinessDay 偏移量是否已经归一化,只需要将这个列表中的日期一个一个用字符串的形式指定,然后重新生成一个 DatetimeIndex,看看它们的结果是否都是归一化的即可。具体代码如下:
rng = pd.date_range('2022-09-01', '2022-09-07', freq='B')
for date in rng:
date_str = date.strftime('%Y-%m-%d')
new_rng = pd.date_range(date_str, periods=3, freq='B')
print(new_rng)
上述代码中,我们使用了一个 for 循环,将列表中的日期一个一个用字符串的形式指定。然后,对于每个日期,我们重新生成了一个 DatetimeIndex,这个 DatetimeIndex 包含了从这个日期开始的 3 个 BusinessDay 偏移量的值,如果这个偏移量已经归一化,那么每个新的 DatetimeIndex 中第一个日期都应该是下一个工作日的日期。例如,2022-09-05 这个日期应该对应的是 2022-09-07 这个日期,而不是 2022-09-06 这个日期。
执行上述代码,会得到如下的输出:
DatetimeIndex(['2022-09-01', '2022-09-02', '2022-09-05'], dtype='datetime64[ns]', freq='B')
DatetimeIndex(['2022-09-06', '2022-09-07', '2022-09-08'], dtype='datetime64[ns]', freq='B')
DatetimeIndex(['2022-09-07', '2022-09-08', '2022-09-09'], dtype='datetime64[ns]', freq='B')
DatetimeIndex(['2022-09-08', '2022-09-09', '2022-09-12'], dtype='datetime64[ns]', freq='B')
DatetimeIndex(['2022-09-09', '2022-09-12', '2022-09-13'], dtype='datetime64[ns]', freq='B')
可以看到,每个新生成的 DatetimeIndex中的第一个日期都是正确的,符合归一化的要求,说明这个 BusinessDay 偏移量已经归一化了。
此外,如果不想一个一个日期去检查 BusinessDay 偏移量是否已经归一化,我们还可以通过一个工具函数 to_offset() 来实现。具体操作如下:
from pandas.tseries.offsets import BDay
bd = BDay()
print(bd.to_offset().is_normalized())
上述代码中,我们创建了一个 BusinessDay 偏移量对象 bd,并将它转换为 Offset 对象,并调用 is_normalized() 方法来检查它是否已经归一化。如果返回值为 True,说明这个偏移量已经归一化了。如果返回值为 False,则说明这个 BusinessDay 偏移量未归一化。
结论
在使用 BusinessDay 偏移量时,需要注意它是否已经归一化。我们可以通过生成 DatetimeIndex 和工具函数 to_offset() 来检查 BusinessDay 偏移量是否已经归一化。如果未归一化,可能会导致一些错误的结果。因此,在使用 BusinessDay 偏移量时,一定要注意归一化的问题。