Python Pandas – 展示给定 BusinessDay 对象所应用的关键字参数
在使用 pandas 进行时间序列分析时,我们经常需要使用到 BusinessDay 这个类。它表示工作日,可以帮助我们计算一段时间内工作日的数量,或者以工作日为单位向前或向后移动时间。本文主要是为了介绍 BusinessDay 对象所应用的关键字参数,从而更好地应用 pandas 进行时间序列分析。
本文所需要的环境是 Python 3.x 和 pandas 库。在开始学习之前,我们需要先安装 pandas :
import pandas as pd
BusinessDay 对象和 BusinesHour 对象
首先,我们需要了解 BusinessDay 对象和 BusinessHour 对象的区别。BusinessDay 对象是不考虑特定地区的非工作时间(如节假日)的工作日时间,而 BusinessHour 对象是考虑到地区的特殊节假日等情况后的工作小时时间。
from pandas.tseries.offsets import *
bd = BusinessDay()
print(bd)
bh = BusinessHour()
print(bh)
输出结果为:
<BusinessDay>
<BusinessHour: BH=09:00-17:00>
其中,<BusinessDay> 表示输出的是 BusinessDay 对象,而 <BusinessHour: BH=09:00-17:00> 则表示输出的是 BusinessHour 对象,其工作时间为每天 9:00 – 17:00 。
frequency 参数
在定义 BusinessDay 对象时,我们可以使用 freq 参数来指定时间单位。freq 的默认值是 B,表示每个工作日。其他的可用时间单位有:
D:每个自然日W:每个周日M:每个月最后一天BM:每个月倒数第二个工作日MS:每个月第一个工作日BMS:每个月第一个工作日Q:每季度最后一天BQ:每季度倒数第二个工作日QS:每季度第一个工作日BQS:每季度第一个工作日
bd = BusinessDay(freq='W')
print(bd)
bh = BusinessHour(freq='30T')
print(bh)
输出结果为:
<Week: weekday=6>
<BusinessHour: BH=09:00-17:00, minutes=30>
其中,<Week: weekday=6> 表示输出的是一个 BusinessDay 对象,它的时间单位为每周日。<BusinessHour: BH=09:00-17:00, minutes=30> 表示输出的是一个 BusinessHour 对象,其工作时间为每天 9:00 – 17:00 ,每隔 30 分钟取一个样本。
normalize 参数
normalize 参数用于指定是否将时间规范化为 UTC 时间。默认值为 False,如果设置为 True,则会将时间规范化为 UTC 时间。
bd = BusinessDay(normalize=True)
print(bd)
输出结果为:
<UTC>
weekmask 和 holidays 参数
weekmask 参数用于指定哪些工作日是可以计算的,比如将周末设为非工作日。默认值是 '1111100',表示周六、周日为非工作日。
bd = BusinessDay(weekmask='1111111')
print(bd)
输出结果为:
<BusinessDay:>
可以看到输出的结果是 <BusinessDay:>,表示所有天都是工作日。
holidays 参数用于指定非工作日的日期。比如,将元旦和国庆设为非工作日:
holidays = ['2022-01-01', '2022-10-01']
bd = BusinessDay(holidays=holidays)
print(bd)
输出结果为:
<BusinessDay: holidays=2>
其中,holidays=2 表示有两个非工作日(元旦和国庆节)。
基于地区的非工作时间设置
如果我们需要根据特定地区的非工作时间进行计算,可以使用 CustomBusinessDay 类,它可以根据传入的非工作日列表和工作时间段来定义一个工作日对象。
from pandas.tseries.offsets import CustomBusinessDay
holidays = ['2022-12-25', '2022-12-26']
weekmask = 'Sun Mon Tue Wed Thu Fri Sat'
cbd = CustomBusinessDay(weekmask=weekmask, holidays=holidays)
print(cbd)
其中,weekmask 参数设为七天,表示每天都是工作日('Sun Mon Tue Wed Thu Fri Sat')。holidays 参数设为圣诞节和节后第一天,表示这两天为非工作日。
输出结果为:
<CustomBusinessDay>
在时间序列中应用 BusinessDay 对象
在处理时间序列数据时,BusinessDay 对象常常会被用来进行时间偏移等操作。下面我们介绍应用 BusinessDay 对象的一些常见例子。
计算一段时间内工作日的数量
通过 business_diff 方法,我们可以计算两个日期之间的工作日数量。
start_date = pd.to_datetime('2022-01-01')
end_date = pd.to_datetime('2022-01-31')
num_of_busdays = pd.date_range(start=start_date, end=end_date, freq=bd).size
print(f'在{start_date}至{end_date}期间,工作日数量为:{num_of_busdays}')
输出结果为:
在2022-01-01 00:00:00至2022-01-31 00:00:00期间,工作日数量为:21
将日期向前或向后移动若干个工作日
我们可以通过 business_day_offset 方法,将一个日期向前或向后移动若干个工作日。
# 将日期向后移动3个工作日
start_date = pd.to_datetime('2022-01-01')
offset = pd.offsets.BusinessDay(3)
shifted_date = start_date + offset
print(f'开始日期为{start_date},向后移动3个工作日后为{shifted_date}')
# 将日期向前移动3个工作日
end_date = pd.to_datetime('2022-01-31')
offset = pd.offsets.BusinessDay(-3)
shifted_date = end_date + offset
print(f'结束日期为{end_date},向前移动3个工作日后为{shifted_date}')
输出结果为:
开始日期为2022-01-01 00:00:00,向后移动3个工作日后为2022-01-06 00:00:00
结束日期为2022-01-31 00:00:00,向前移动3个工作日后为2022-01-26 00:00:00
结论
本文介绍了在 pandas 中使用 BusinessDay 对象进行时间序列分析的基本方法,包括如何创建、设置参数、以及在时间序列中的具体应用。理解和熟练掌握 BusinessDay 对象的使用,有助于更轻松地进行时间序列分析。
极客笔记