说明
日期偏移(DateOffset)是 pandas 中实现日历频率的机制,遵循月份长度、周末、节假日等日历规则,与固定时长的
Timedelta不同。 所有偏移类均位于pandas.tseries.offsets,并可通过freq字符串别名使用。
import pandas as pd
from pandas.tseries.offsets import (
DateOffset, BDay, BMonthEnd, BMonthBegin, MonthEnd, MonthBegin,
QuarterEnd, QuarterBegin, YearEnd, YearBegin, Week, WeekOfMonth,
BusinessHour, CustomBusinessDay,
)DateOffset
说明
通用日期偏移基类,支持任意时间单位的组合。
ts = pd.Timestamp('2026-08-19 13:05:00')
# 组合偏移
print(ts + DateOffset(years=1, months=2, days=3, hours=4))
# 2027-10-22 17:05:00
# 月份加减自动处理月末
print(pd.Timestamp('2026-01-31') + DateOffset(months=1))
# 2026-02-28 00:00:00
# 频率字符串对应
print(ts + pd.offsets.DateOffset(weeks=2))BDay
说明
工作日偏移(Business Day),默认跳过周六、周日。频率字符串别名:
'B'。
ts = pd.Timestamp('2026-08-21') # 周五
print(ts + BDay(1)) # 2026-08-24(周一)
print(ts + BDay(2)) # 2026-08-25(周二)
print(pd.date_range('2026-08-03', periods=3, freq='B'))BMonthEnd / BMonthBegin
说明
工作月月末 / 工作月月初偏移,自动跳过周末。频率字符串别名:
'BM'/'BMS'。
print(pd.Timestamp('2026-01-15') + BMonthEnd()) # 2026-01-30(1 月最后一个工作日)
print(pd.Timestamp('2026-01-15') + BMonthBegin()) # 2026-02-02(2 月第一个工作日)
# 带 n 的偏移
print(pd.Timestamp('2026-01-31') + BMonthEnd(2)) # 2026-03-31MonthEnd / MonthBegin
说明
日历月月末 / 月初偏移,不跳过周末。频率字符串别名:
'ME'(新)/'M'(旧)、'MS'。
print(pd.Timestamp('2026-08-19') + MonthEnd()) # 2026-08-31
print(pd.Timestamp('2026-08-19') + MonthBegin()) # 2026-09-01
# 月末滚动
print(pd.Timestamp('2026-01-31') + MonthEnd(1)) # 2026-02-28
print(pd.Series(pd.date_range('2026-01-01', periods=3, freq='ME')))QuarterEnd / QuarterBegin
说明
季度末 / 季度初偏移,可指定锚定月份。频率字符串别名:
'QE'(新)/'Q'(旧)、'QS'。
print(pd.Timestamp('2026-08-19') + QuarterEnd()) # 2026-09-30(默认 12 月锚定)
print(pd.Timestamp('2026-08-19') + QuarterBegin()) # 2026-10-01
# 指定锚定月份(如 2 月锚定)
print(pd.Timestamp('2026-08-19') + QuarterEnd(month=2))
# 2026-11-30YearEnd / YearBegin
说明
年末 / 年初偏移,可指定锚定月份。频率字符串别名:
'YE'(新)/'Y'或'A'(旧)、'YS'或'AS'。
print(pd.Timestamp('2026-08-19') + YearEnd()) # 2026-12-31
print(pd.Timestamp('2026-08-19') + YearBegin()) # 2027-01-01
# 指定财务年结月(如 6 月)
print(pd.Timestamp('2026-08-19') + YearEnd(month=6))
# 2027-06-30Week
说明
周偏移,默认按周日锚定,可指定
weekday。频率字符串别名:'W'、'W-MON'等。
print(pd.Timestamp('2026-08-19') + Week()) # 2026-08-23(周日)
print(pd.Timestamp('2026-08-19') + Week(weekday=0)) # 2026-08-24(周一)
print(pd.date_range('2026-01-01', periods=3, freq='W-MON'))WeekOfMonth
说明
每月第几周的星期几偏移(如「每月第 2 个周五」)。
# week=0 表示第一个,weekday=4 表示周五
wom = WeekOfMonth(week=1, weekday=4)
print(pd.Timestamp('2026-08-19') + wom)
# 2026-09-11(9 月第二个周五)
print(pd.date_range('2026-01-01', periods=3, freq='WOM-2FRI'))BusinessHour
说明
工作小时偏移,默认 09:00-17:00,周一至周五。频率字符串别名:
'BH'。
ts = pd.Timestamp('2026-08-19 15:00') # 周三下午 3 点
print(ts + BusinessHour()) # 2026-08-19 16:00
print(ts + BusinessHour(3)) # 2026-08-20 10:00(跨天)
# 自定义工作时间
bh = BusinessHour(start='09:00', end='12:00')
print(ts + bh)CustomBusinessDay
说明
自定义工作日偏移,支持节假日日历与自定义星期工作日。频率字符串别名:
'C'。
from pandas.tseries.holiday import USFederalHolidayCalendar
cal = USFederalHolidayCalendar()
cbd = CustomBusinessDay(calendar=cal)
print(pd.Timestamp('2026-07-03') + cbd) # 2026-07-06(跳过 7/4 独立日周末)
# 自定义工作日(如仅周三)
wed_only = CustomBusinessDay(weekmask='Wed')
print(pd.date_range('2026-08-01', periods=3, freq=wed_only))自定义偏移
说明
可通过继承
DateOffset或组合现有偏移构建自定义频率。
from pandas.tseries.offsets import DateOffset
# 组合偏移(每 2 周 + 1 天)
custom = DateOffset(weeks=2, days=1)
print(pd.Timestamp('2026-08-19') + custom)
# 使用 apply / rollforward / rollback 精确控制
class QuarterEndFriday(MonthEnd):
"""月末向前调整到周五"""
def __init__(self):
super().__init__()
# 更常用:通过 calendar 与 offsets 组合实现业务频率节假日日历 pandas.tseries.holiday
说明
pandas.tseries.holiday模块提供节假日日历定义,可与CustomBusinessDay等偏移配合生成业务频率。
from pandas.tseries.holiday import (
USFederalHolidayCalendar,
AbstractHolidayCalendar,
Holiday, nearest_workday, # 或具体规则函数
)
from pandas.tseries.offsets import CustomBusinessDay
# 使用内置美国联邦节假日
cal = USFederalHolidayCalendar()
print(cal.holidays('2026-01-01', '2026-12-31'))
# DatetimeIndex(['2026-01-01', '2026-01-19', '2026-02-16', ...])
# 自定义节假日日历
class ChinaHolidayCalendar(AbstractHolidayCalendar):
rules = [
Holiday('New Year', month=1, day=1),
Holiday('National Day', month=10, day=1),
]
cn_cal = ChinaHolidayCalendar()
cbd_cn = CustomBusinessDay(calendar=cn_cal)
print(pd.bdate_range('2026-09-28', periods=5, freq=cbd_cn))
# 获取节假日日期
print(cn_cal.holidays('2026-01-01', '2026-12-31'))常用内置日历
| 日历类 | 说明 |
|---|---|
USFederalHolidayCalendar | 美国联邦节假日 |
USColumbusDay / USThanksgivingDay 等 | 美国单个节日规则 |
AbstractHolidayCalendar | 自定义日历基类 |
Holiday | 定义单个节假日规则(支持 month、day、offset、observance) |
🔗 相关链接
- 9.2 创建方法 -
freq参数与偏移的映射 - 9.3 时间索引 - 频率字符串与索引的
freq属性 - 9.5 时间序列操作 -
resample/asfreq使用频率