Python Pandas – 检查 BusinessHour Offset 是否已经规范化
在数据分析和处理中,时间序列数据是非常重要的一块内容,而 Pandas 是 Python 中很流行的用于数据处理和分析的库。在 Pandas 中,可以利用 BusinessHour 来对时间序列进行处理,而在这个过程中,我们需要有意识地对 BusinessHour Offset 进行规范化,以保证数据分析的准确性。那么,在本文中,我们将介绍如何通过 Python Pandas 来检查 BusinessHour Offset 是否已经规范化。
什么是 BusinessHour
BusinessHour 是一个很方便的类,在 Pandas 中,用于表示一周中的正常工作时间。它通常定义了一组工作日,以及工作日的开始和结束时间。同时,BusinessHour 还可以配合 Frequency 类型一起使用,生成要进行计算的时间点序列,业务常用,我们要求预测的时间序列的每个时间点都是在工作日内的,以此来计算业务指标。
我们可以通过以下代码来创建一个 BusinessHour:
from pandas.tseries.offsets import CDay, CustomBusinessHour
# 定义工作日(周一至周五)
business_days = CDay(weekmask='Mon Tue Wed Thu Fri')
# 定义工作日的开始和结束时间
start_time = '08:00'
end_time = '18:00'
# 定义 BusinessHour
bhour = CustomBusinessHour(start = start_time, end = end_time, holidays = [], weekmask = business_days)
在上面的代码中,我们首先通过 CDay 创建了一个包含周一至周五这些工作日的日期偏移量对象,并将其赋值给了 business_days。然后,我们又通过 CustomBusinessHour 创建了一个 BusinessHour 对象,其中 start 和 end 分别表示正常工作日的开始和结束时间,holidays 则是指定了假期的日期列表,weekmask 则是指定了哪些天是工作日。如果想要更深入了解 BusinessHour 的定义和使用,可以查看 Pandas 官方文档。
什么是 BusinessHour Offset
在 Pandas 中,BusinessHour Offset 可以理解为一种用于定义时间序列的间隔。事实上,在 Pandas 中,还有很多种类似的 Offset,例如 DateOffset、MonthEnd 等等。而 BusinessHour Offset,通常是通过将 CustomBusinessHour 与 BDay 或其他 DateOffset 相结合来创建的。在本文中,我们将以 CBusinessHour 为例来进行讲解。
我们可以通过以下代码来创建一个 BusinessHour Offset:
from pandas.tseries.offsets import BDay
from pandas.tseries.offsets import CustomBusinessHour as CBusinessHour
# 创建一个每个工作日上午 9 点到下午 5 点半的 BusinessHour Offset
bhour_offset = CBusinessHour(start= '09:00', end = '17:30', holidays = [], weekmask='Mon Tue Wed Thu Fri') + BDay()
在上面的代码中,我们首先创建了一个 CBusinessHour 对象,表示正常的工作日是周一至周五,上午 9 点到下午 5 点半,没有假期。然后,我们又将它与 BDay 相结合,生成了一个每个工作日的 BusinessHour Offset。这时,我们可以通过 bhour_offset 的 delta 属性来获取它所表示的时间间隔:
print(bhour_offset)
print(bhour_offset.delta)
上述代码执行结果如下:
<BusinessHour: BH=09:00-17:30>
0 days 08:30:00
这说明,每个 bhour_offset 的间隔为 8 小时半,这个间隔是需要进一步规范化的。在下文中,我们将介绍如何检查 BusinessHour Offset 是否已经规范化。
检查 BusinessHour Offset 是否已经规范化
在生成 BusinessHour Offset 后,我们需要检查它是否已经规范化。具体来说,规范化的 BusinessHour Offset 应该满足以下条件:
- 它的时间间隔不应该超过 1 个工作日(准确地说,是 BusinessDay,而不是日历日);
- 它的时间间隔应该是 BusinessHour 的倍数。
我们可以通过以下代码来检查 BusinessHour Offset 是否已经规范化:
def check_businesshour_offset(bhour_offset):
# 获取时间间隔的分钟数
minutes = bhour_offset.delta.seconds / 60
# 获取一天内的分钟数
business_day_minutes = CBusinessHour(start= '09:00', end = '17:30', holidays = [], weekmask='Mon Tue Wed Thu Fri').delta.seconds / 60
# 判断时间间隔是否超过1个BusinessDay
if bhour_offset.freq.n == 1 and minutes > business_day_minutes:
print("该 BusinessHour Offset 时间间隔超过 1 个 BusinessDay。请进行规范化处理。")
# 判断时间间隔是否是 BusinessHour 的倍数
elif bhour_offset.freq.n > 1 and (business_day_minutes / bhour_offset.freq.n) % minutes != 0:
print("该 BusinessHour Offset 时间间隔不是 BusinessHour 的倍数。请进行规范化处理。")
# 否则,说明 BusinessHour Offset 已经规范化
else:
print("该 BusinessHour Offset 已经规范化。")
在上面的代码中,我们定义了一个名为 check_businesshour_offset 的函数,它接受一个 CBusinessHour 和一个 BDay 相结合的 BusinessHour Offset 作为参数。首先,我们通过 bhour_offset.delta.seconds / 60 计算出了时间间隔的分钟数,并通过 CBusinessHour(start= '09:00', end = '17:30', holidays = [], weekmask='Mon Tue Wed Thu Fri').delta.seconds / 60 计算出了一天内工作时间的分钟数。然后,我们分别判断了时间间隔是否超过 1 个 BusinessDay 和是否是 BusinessHour 的倍数,并输出了相应的提示信息。
我们可以通过以下代码来测试 check_businesshour_offset 函数:
check_businesshour_offset(bhour_offset)
如果上述代码输出了 “该 BusinessHour Offset 时间间隔超过 1 个 BusinessDay。请进行规范化处理。” 的提示信息,那么说明 bhour_offset 还没有规范化。我们需要对它进行规范化处理,以保证数据分析的准确性。具体来说,我们需要将它转换为一个 CustomBusinessDay,并指定它所表示的时间间隔。
from pandas.tseries.offsets import CustomBusinessDay
# 规范化 bhour_offset
business_day_offset = CustomBusinessDay(start='09:00', end='17:30', weekmask='Mon Tue Wed Thu Fri') * (minutes // business_day_minutes)
print(business_day_offset)
在上面的代码中,我们使用了 CustomBusinessDay,并将它与 (minutes // business_day_minutes) 相乘。这其实相当于将 bhour_offset 中的时间间隔切割成了若干个 BusinessDay。例如,如果 bhour_offset 的时间间隔是 10 个小时,而一天的工作时间是 8 个小时,那么上述代码将生成一个 CustomBusinessDay,它的时间间隔是 1.25 个 BusinessDay。这时,我们就可以将 business_day_offset 用作时间序列的间隔了。
最后,我们再次调用 check_businesshour_offset 函数,来检查 business_day_offset 是否已经规范化:
check_businesshour_offset(business_day_offset)
如果上述代码输出了 “该 BusinessHour Offset 已经规范化。” 的提示信息,那么说明 business_day_offset 已经被成功规范化了。
结论
BusinessHour 在时间序列分析中非常常用,而 BusinessHour Offset 则是定义时间序列间隔的重要手段。“规范化” 是用于保证 BusinessHour Offset 可靠性的重要步骤。通过本文介绍的方法,我们可以轻松检查并规范化 BusinessHour Offset,从而提高数据分析的准确性。
极客笔记