📅  最后修改于: 2023-12-03 15:19:16.271000             🧑  作者: Mango
Pandas是一个Python开源数据分析库,通过其tseries模块中的offsets子模块,提供了对业务日历计算的支持。BusinessDay对象就是对业务日历进行计算的一个重要工具。
BusinessDay对象具有以下重要属性和方法:
n: int类型,该属性表示偏移量,可以为正、负或0。
normalize: bool类型,该属性表示,如果为True(默认为True),则偏移调整日期到午夜0点,否则保留时间信息。
weekmask: str类型或None,该属性表示一周7天的哪些天不计入业务工作日。字符串可以采用形如“Mon、Tue、Wed、Thu、Fri、Sat、Sun”的表示方式。默认是None,即采用全部7天都计算的方式,如果只采用Mon-Fri计算,则需设置weekmask=‘Mon Tue Wed Thu Fri’。
holidays: list或pandas.date_range或HolidayCalendar或None,表示节假日列表。节假日日期对于业务日期计算具有特殊作用,如计算时一般不包含节假日。如果为None,则不考虑假期。
rollforward: 返回距离当前日期最近的下一个业务日的日期。
rollback: 返回距离当前日期最近的上一个业务日的日期。
apply: 在时间序列上应用偏移量,返回新的时间序列。
其中,rollforward(或rullover)以及rollback(或rollunder)的差别在于偏移方向。对于以当前日期为基础,往前(或往后)计算的一段区间,如果使用rollforward,则得到的是这段区间内距离当前日期最近的后面的业务日期;反之,如果使用rollback,则得到的是这段区间内距离当前日期最近的前面的业务日期。
import pandas as pd
import numpy as np
from pandas.tseries.offsets import BusinessDay
# 假设当前是2020年10月1日周四
bd = BusinessDay(n=2, normalize=True, weekmask='Mon Tue Wed Thu Fri', holidays=['2020-10-05'])
print(bd.rollforward(pd.to_datetime('2020-10-01'))) # 输出 2020-10-05
print(bd.rollback(pd.to_datetime('2020-10-01'))) # 输出 2020-09-30
# 应用到时间序列
rng = pd.date_range('2020-10-01 10:00:00', periods=4, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts)
ts1 = ts.shift(1) # 普通偏移
ts2 = ts.shift(2*bd) # 业务时间偏移
print(ts1)
print(ts2)
BusinessDay是对于业务日期计算非常实用的工具,对于需考虑业务日历进行日期计算的场景,其能够提供更加精准的计算方案,是Python Pandas的一个重要特性。