如何用Pandas创建自定义工作日的小时频率偏移量?
问题描述
我希望创建一个偏移别名,覆盖自定义工作日的每一小时。例如,将周六和周日设为工作日,工作时段为00:00至24:00。
尝试使用CustomBusinessHour时遇到以下问题:
CustomBusinessHour(weekmask="Sat Sun", start="00:00", end="24:00")和CustomBusinessHour(weekmask="Sat Sun", start="00:00", end="00:00")均不被允许- 使用
CustomBusinessHour(weekmask="Sat Sun", start="00:00", end="23:59")时,执行代码后每过完一天会多出1分钟的偏移 - 不指定
start和end参数时,默认会使用9:00-17:00的时段
请问如何正确创建这类偏移别名?或者是否有办法将Hour偏移与CustomBusinessDay结合使用?
解决方案
方法一:拆分逻辑,结合CustomBusinessDay与Hour偏移
这种方式更直观,完全贴合需求:先筛选出自定义工作日,再为每个工作日生成全天24小时的时间点。
import pandas as pd import datetime as dt # 定义自定义工作日规则:仅周六、周日为工作日 custom_bday = pd.offsets.CustomBusinessDay(weekmask='Sat Sun') # 生成指定区间内的所有自定义工作日日期 business_days = pd.date_range(dt.datetime(2020,1,1), dt.datetime(2020,1,15), freq=custom_bday) # 为每个工作日生成0-23点的小时序列,再合并排序 hourly_sequences = [pd.date_range(day, day + dt.timedelta(hours=23), freq='H') for day in business_days] final_hourly_range = pd.concat(hourly_sequences).sort_values() print(final_hourly_range)
方法二:修正CustomBusinessHour的时间边界
如果坚持要用CustomBusinessHour,可以把结束时间设为23:59:59来规避1分钟偏移问题,不过需要注意跨天场景的验证:
freq = pd.offsets.CustomBusinessHour(weekmask='Sat Sun', start='00:00', end='23:59:59') hourly_range = pd.date_range(dt.datetime(2020,1,1), dt.datetime(2020,1,15), freq=freq)
这种方式边界处理容易出问题,更推荐第一种拆分实现的方案。
方法三:封装为可复用的自定义函数
如果需要重复使用该规则,可以封装成函数:
import pandas as pd import datetime as dt def custom_weekend_hourly(start_date, end_date): custom_bday = pd.offsets.CustomBusinessDay(weekmask='Sat Sun') business_days = pd.date_range(start_date, end_date, freq=custom_bday) hourly_sequences = [pd.date_range(day, day + dt.timedelta(hours=23), freq='H') for day in business_days] return pd.concat(hourly_sequences).sort_values() # 调用示例 result = custom_weekend_hourly(dt.datetime(2020,1,1), dt.datetime(2020,1,15))
内容的提问来源于stack exchange,提问作者DavidKleindienst
相关产品推荐
相关产品推荐

