Python Pandas – 获取应用于CustomBusinessDay偏移量的工作日掩码
在使用Pandas库进行时间序列数据处理时,我们通常需要对时间序列进行偏移。Pandas提供了许多内置的偏移量,如BusinessDay、MonthEnd、QuarterBegin等,还支持自定义偏移量CustomBusinessDay。CustomBusinessDay偏移量允许我们指定一周中的哪些工作日是有效的。本文将介绍如何获取应用于CustomBusinessDay偏移量的工作日掩码。
更多Pandas相关文章,请阅读:Pandas 教程
CustomBusinessDay
CustomBusinessDay是一种自定义工作日偏移量,允许我们指定一周中的哪些工作日是有效的。例如,如果我们希望仅将星期一至星期四视为工作日,则可以使用以下代码定义CustomBusinessDay:
from pandas.tseries.offsets import CustomBusinessDay
weekdays = ["Mon", "Tue", "Wed", "Thu"]
custom_business_day = CustomBusinessDay(weekmask=weekdays)
这将创建一个偏移量,表示每个工作日的前进或倒退。如果我们现在想向前移动7天,我们可以使用以下代码:
from pandas import Timestamp
start_date = Timestamp('2022-01-24')
end_date = start_date + 7 * custom_business_day
这将返回一个新的Timestamp对象,其日期为2022年2月2日,跳过了周五、周六和周日。
工作日掩码
上面的代码演示了如何使用CustomBusinessDay,但我们更可能需要了解每个日期是否为工作日。这就是所谓的工作日掩码。Pandas在CustomBusinessDay对象中包含了一个名为“weekmask”的属性,该属性指定了每个工作日的类别。weekmask是一个7位二进制字符串表示一周7天的类别。它的第一个位置表示周一,第二个位置表示周二,以此类推。如果某个位置的值为1,则该天被视为工作日;如果为0,则该天被视为非工作日。
例如,如果weekmask为”1111000″,则第1到4个位置表示周一到周四为工作日,第5到7个位置表示周五至周日为非工作日。以下示例代码演示了如何获取2019年9月份的工作日掩码,并输出到控制台:
import pandas as pd
from pandas.tseries.offsets import CustomBusinessDay
start_date = pd.Timestamp('2019-09-01')
end_date = pd.Timestamp('2019-10-01')
weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri"]
custom_business_day = CustomBusinessDay(weekmask='1111100')
date_range = pd.date_range(start_date, end_date, freq=custom_business_day)
print(custom_business_day.weekmask)
print(date_range)
print([d.dayofweek for d in date_range])
这段代码将输出以下内容:
1111100
DatetimeIndex(['2019-09-02', '2019-09-03', '2019-09-04', '2019-09-05',
'2019-09-06', '2019-09-09', '2019-09-10', '2019-09-11',
'2019-09-12', '2019-09-13', '2019-09-16', '2019-09-17',
'2019-09-18', '2019-09-19', '2019-09-20', '2019-09-23',
'2019-09-24', '2019-09-25', '2019-09-26', '2019-09-27',
'2019-09-30'], dtype='datetime64[ns]', freq='C')
[0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0]
这组输出告诉我们2019年9月份只有周末两天不是工作日(weekmask为”1111100″),因此在生成日期范围时只包括除周末外的工作日;第三行输出告诉我们每个日期是一周的第几天,0表示周一,6表示周日。
获取工作日掩码
要获取由CustomBusinessDay偏移量定义的工作日掩码,我们可以使用CustomBusinessDay对象的weekmask属性。以下是一个示例代码:
from pandas.tseries.offsets import CustomBusinessDay
weekdays = ["Mon", "Tue", "Wed", "Thu"]
custom_business_day = CustomBusinessDay(weekmask=weekdays)
print(custom_business_day.weekmask)
这将输出”1111000″,提示我们自定义的工作日偏移量仅将周一到周四视为工作日。
由于weekmask属性返回的是一个字符串而不是一个列表或元组,因此我们还可以使用字符串操作来检索一周的单独天数。例如,要检查周一是否为工作日,我们可以使用以下代码:
weekdays = ["Mon", "Tue", "Wed", "Thu"]
weekmask = "".join("1" if day in weekdays else "0" for day in ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"])
is_mon_workday = weekmask[0] == "1"
这将将weekmask设置为”1111000″,并将is_mon_workday设置为True,因为”1111000″的第一个位置为1,即周一为工作日。
结论
本文向您展示了如何获取CustomBusinessDay偏移量的工作日掩码。我们看到了如何定义一个自定义的工作日偏移量,并使用它在时间序列中向前或向后移动。我们了解了Pandas中的weekmask属性以及如何使用其检查单个日期是否为工作日。通过这些标准和技巧,我们可以轻松地处理时间序列数据,并自定义我们的偏移量以适应我们的需求。