Python Pandas – 检查 BusinessHour Offset 是否已经规范化

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,例如 DateOffsetMonthEnd 等等。而 BusinessHour Offset,通常是通过将 CustomBusinessHourBDay 或其他 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_offsetdelta 属性来获取它所表示的时间间隔:

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,从而提高数据分析的准确性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程