跳转至

Pandas DateOffset 对象

概念与用途

DateOffset 表示遵循日历规则的日期偏移,与固定秒数的 Timedelta 不同。它可表达月末、工作日、季度、财年和自定义营业日。

核心 API

pd.DateOffset 及 pd.offsets 中的 Day、BusinessDay、MonthEnd、MonthBegin、QuarterEnd、YearEnd、CustomBusinessDay;配合 date_range(freq=...) 和时间戳算术使用。

可运行示例

import pandas as pd
from pandas.tseries.offsets import BusinessDay, MonthEnd

date = pd.Timestamp("2026-07-17")
print(date + BusinessDay(1))
print(date + MonthEnd(0))
print(pd.date_range("2026-01-01", periods=4, freq=MonthEnd()))

示例二:自定义工作日

import pandas as pd
from pandas.tseries.offsets import CustomBusinessDay

calendar = CustomBusinessDay(weekmask="Mon Tue Wed Thu Fri", holidays=["2026-01-01"])
days = pd.date_range("2025-12-31", periods=4, freq=calendar)
print(days)

CustomBusinessDay 返回可复用的偏移规则。节假日列表必须由可靠日历维护,示例中的单个日期不构成完整市场日历。

示例三:rollforward 与 rollback

import pandas as pd
from pandas.tseries.offsets import MonthEnd

offset = MonthEnd()
date = pd.Timestamp("2026-02-10")
print(offset.rollforward(date))
print(offset.rollback(date))

rollforward/rollback 移到最近的有效偏移日期;直接 date + offset 则按偏移次数前进,语义不同。

返回、对齐与性能

Timestamp 加偏移返回新 Timestamp,DatetimeIndex 加偏移返回新索引。对 Series 使用偏移时结果按原索引位置计算,不涉及两个对象的标签对齐。部分非向量化偏移对大数组可能触发性能警告,应优先规则频率或预生成日历后连接。

注意事项

MonthEnd(0) 表示滚动到当前或下一个月末,若日期已在月末则保持不变;测试边界日期。普通 BusinessDay 只处理周末,不了解地区法定节假日,真实交易或结算日历需 CustomBusinessDay 或专业日历。带时区日期跨夏令时时要验证结果。