Python Pandas – 返回应用于给定的 CustomBusinessHour 对象的规则代码
在数据分析和处理中,时间序列经常是不可避免的问题。在进行财务数据、股票市场分析或其他与时间有关的数据的处理时,我们通常需要处理感知工作时间的日期时间数据。而Pandas包中的时间序列功能就极大地满足了这些需要。Pandas包含一些用于创建、处理和分析时间序列数据的方法和数据类型。在这些时间序列处理方法中,CustomBusinessHour对象是一种非常有用的工具,可以帮助更好地处理各种复杂的时间序列数据,从而更好地构建业务模型。
本文将探讨如何使用Python Pandas处理CustomBusinessHour对象,这个对象是将一周工作时间来自定义的时间,你可以自己设置某一天下班时间比如周五19点,或者全天休息等。同时,我们将用具体的代码实例来展示如何返回应用于给定的CustomBusinessHour对象的规则代码。
CustomBusinessHour的创建
在Pandas包中创建CustomBusinessHour对象的方法是使用’CustomBusinessHour’函数。这个函数可以被用来制定一个你自己定义的工作日时间。它接受几个参数:
start参数:定义一天的起始时间,默认为9:00 AM。-
end参数:定义一天最后的时间,默认为5:00 PM。 -
weekmask参数:定义哪些工作日可以被报告为工作日,默认情况下,周末(星期六和星期日)是非工作日,所以缺省weekmask是两个“X”分别表示星期六和星期日均为非工作日。例如,范例代码中的weekmask='Mon Tue Wed Thu Fri'定义了星期六和星期日是休息日,周一至周五为工作日。 -
holidays参数:当你想要计算一个特殊时间段内的工作日天数时,这个参数定义了一些特殊的日期不会计入工作日。例如,如果创造一个自定义的工作周在一周的工作日之外,其可以通过这个参数使其变为工作日。
下面我们来创建自定义的业务日期:
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessHour
# 定义工作规则:9点到17点,周一到周五为工作日,周六周日为休息日
bh = CustomBusinessHour(start='09:00', end='17:00', weekmask='Mon Tue Wed Thu Fri')
print(bh)
代码输出为:
<CustomBusinessHour: CBH=09:00-17:00>
可以看出,我们已经成功地创建了一个工作规则。
时间序列处理
接着,我们通过一个例子来演示CustomBusinessHour对象的应用,例如计算一些网络服务在工作时间内的运行时间。
在下面的代码中,我们用DataFrame来存储每一次操作的开始时间和结束时间。然后,使用CustomBusinessHour对象,来计算工作日内的花费时间。
# 创造一些数据,由于9点之前是不工作的,所以第一天的数据要加上一天
time_index = pd.date_range('2018-11-01 08:01:00', periods=300, freq='10T')
df = pd.DataFrame({'start': time_index})
df['end'] = df['start'].shift(1)
df.at[0, 'end'] = pd.Timestamp('2018-11-01 09:00:00')
df['diff'] = df['start'] - df['end']
# 计算工作日内的花费时间
worktime = df['diff'].apply(lambda x: bh.rollforward(x) - bh.rollback(x))
print(worktime)
我们已经成功计算出了每个时间段在工作日内的花费时间,现在我们需要将结果进行汇总。
首先,我们需要计算出工作日的总时间:
# 计算总工作时间
weekdays = pd.date_range(start=df['start'].min(), end=df['start'].max(), freq='B')
total_work_hours = sum([bh.onOffset(pd.Timestamp(date.date())) for date in weekdays])
print(total_work_hours)
此代码段的输出结果为:
72 hours 0 minutes 0 seconds
下一步,我们使用以下代码段来计算操作的总运行时间:
# 计算总花费时间
total_diff = df['diff'].sum()
print(total_diff)
该代码段的输出结果为:
1 days 02:00:00
现在我们可以计算出网络服务在工作时间下在一周内总共运行了多长时间:
# 计算运行时间
running_time = total_work_hours - total_diff
print(running_time)
输出结果为:
46 hours 0 minutes 0 seconds
结论
在本文中,我们介绍了如何使用Python Pandas处理CustomBusinessHour对象。我们通过创建自定义的工作日规则并与时间序列数据进行计算来说明了CustomBusinessHour对象的应用场景。我们还通过一个具体的例子演示了如何计算网络服务在工作日内的运行时间。这里有很多方式都可以使用CustomBusinessHour对象来进行时间序列处理,希望这篇文章能够为你的实际应用提供一些帮助。
极客笔记