Python Pandas – 创建BusinessHour offset
在Python Pandas中,我们经常需要对日期时间进行处理。而在实际应用中,我们常常需要知道某些时间段内的工作时间或者营业时间。这时候就用得上BusinessHour
类型了。Pandas可以通过创建BusinessHour
类型对象来表示仅在工作时间内的时间偏移量。以下将介绍如何创建BusinessHour
offset。
更多Pandas相关文章,请阅读:Pandas 教程
什么是BusinessHour offset?
BusinessHour
offset是Python Pandas中一种特殊的offset,表示仅在指定的工作时间内的时间偏移量。在创建时间序列时,我们可以根据BusinessHour
offset计算出下一个符合条件的到来时间。下面看一个简单的例子。
from pandas.tseries.offsets import BusinessHour
from pandas import Timestamp
bh = BusinessHour(start='09:00',end='17:00')
timestamp = Timestamp('2020-01-01 10:30')
next_b_time = bh.rollforward(timestamp)
print(next_b_time) # 2020-01-01 11:00:00
上述代码中,我们首先导入BusinessHour
类型,并将工作时间设置为从9点到17点。然后我们创建了一个时间戳对象,并将它设置为”2020-01-01 10:30″。接着,我们调用rollforward
方法并传入时间戳对象,这个方法的作用是计算从当前时间开始下一个符合规定的时间。由于当前时间是10:30,而按照我们设置的工作时间,下一个符合规定的时间是11:00。因此,输出结果是2020-01-01 11:00:00
。
创建BusinessHour offset
创建BusinessHour
offset的最基本方法是,使用BusinessHour
类构造实例。BusinessHour
类有以下几个参数:
- start:时间区间起始时间,这个时间必须是一个字符串类型(形如明确的“09:00:00”)
- end:时间区间结束时间,这个时间必须是一个字符串类型(形如明确的“09:00:00”)
- offset:偏移量,这个偏移量可以是一个时间段,例如“1小时”,也可以是“1天”,具体的偏移量与
pandas.tseries.offsets
模块中定义的offset相同。默认是1小时。 - time_rule:工作时间规则,必须是一个
pandas.tseries.offsets.CustomBusinessDay
类型的实例。CustomBusinessDay
是Pandas中的另一个offset类型,表示自定义的工作日。
下面是一个示例代码:
from pandas.tseries.offsets import BusinessHour
from pandas.tseries.offsets import CustomBusinessDay
from pandas.tseries.holiday import Holiday
from pandas import Timestamp
class MyHoliday(Holiday):
def __init__(self):
super(MyHoliday, self).__init__(name='my_holiday',month=1,day=1)
bh = BusinessHour(start='9:00', end='17:00', offset='1h', time_rule=CustomBusinessDay(holidays=MyHoliday()))
timestamp = Timestamp('2021-01-01 16:30')
next_b_time = bh.rollforward(timestamp)
print(next_b_time) # 2021-01-04 09:00:00
上面的代码中,我们定义了一个MyHoliday类,继承了Pandas中的Holiday类型,并定义自己的假期规则——元旦。假设今天是2021年1月1日,那么它就是一个假期。接着,我们创建了一个BusinessHour
对象,指定了工作时间从9点到17点,偏移量为1个小时,CustomBusinessDay
类型的参数指定假期规则。最后,我们创建了一个时间戳,并调用BusinessHour.rollforward()
方法计算下一个业务时间。
使用BusinessHour offset计算时间偏移量
假设我们需要计算从某一个时间开始10个工作小时后的时间,我们可以使用BusinessHour
offset的apply
方法实现:
from pandas.tseries.offsets import BusinessHour
from pandas import Timestamp
bh = BusinessHour(start='9:00', end='17:00', offset='1h')
timestamp = Timestamp('2021-01-04 14:30')
next_b_time = bh.apply(timestamp, n=10)
print(next_b_time) # 2021-01-06 12:30:00
上述代码中,我们使用BusinessHour
类创建了一个BusinessHour
offset对象,并指定了起始时间为9点,结束时间为17点,偏移量为1小时。接着,我们创建了一个时间戳对象,将其设置为”2021-01-04 14:30″。然后,我们调用apply
方法,并传入时间戳对象和参数n=10,表示需要计算10个工作小时后的时间。最后,输出结果是2021-01-06 12:30:00
。
自定义BusinessHour offset
如果默认的BusinessHour
offset不能够满足我们的需求,我们还可以自定义一个BusinessHour
offset。自定义BusinessHour
offset需要继承pandas.tseries.offsets.BusinessHourMixin
类,并且实现两个方法:
_is_business_hour
: 判断一个时间是否处于工作时间内_apply_business_hour
: 将一个时间向前或者向后移动若干个工作小时
下面是一个自定义BusinessHour
offset的例子:
from pandas.tseries.offsets import BusinessHour,CustomBusinessHour
from pandas import Timestamp
class CustomBusinessHourOffset(BusinessHour):
def __init__(self, start='09:00', end='17:00', offset='1h', **kwargs):
super().__init__(start=start, end=end, offset=offset, **kwargs)
def _is_business_hour(self, time):
"""判断该时间是否在公司的工作时间之内"""
if time.weekday() < 5:
time_range = (self._get_time('start', time), self._get_time('end', time))
return time_range[0] <= time <= time_range[1]
else:
return False
def _apply_business_hour(self, time, n):
"""将时间增加或减少一个工作小时"""
sign = n // abs(n)
increment = 0
while increment != abs(n):
new_time = time + increment * self.offset
if self._is_business_hour(new_time):
increment += sign
return new_time
我们定义了一个名为CustomBusinessHourOffset
的类,继承于BusinessHour
类,并重写了_is_business_hour
和_apply_business_hour
方法。_is_business_hour
方法用来判断该时间是否在工作时间范围内,这里定义了工作时间在周一到周五,9:00-17:00之间;_apply_business_hour
方法用来实现向前或向后移动若干个工作小时的功能。该方法使用 while 循环找到下一个符合规定的时间。最后,我们创建了一个CustomBusinessHourOffset
对象,并测试了它的使用方法:
cbo = CustomBusinessHourOffset(start='09:00', end='17:00', offset='1h')
timestamp = Timestamp('2021-01-04 10:30')
next_cbo_time = cbo.apply(timestamp, n=3)
print(next_cbo_time) # 2021-01-04 13:30:00
结论
在Python Pandas中,我们经常需要对日期时间进行处理。而在实际应用中,我们常常需要知道某些时间段内的工作时间或者营业时间。使用BusinessHour
类型对象,我们可以很方便地表示仅在指定的工作时间内的时间偏移量。BusinessHour
类型可以根据公司的具体业务时间定义,如果默认的偏移量不能满足我们的需求,我们还可以自定义一个BusinessHour
offset。