Pandas 的 DateOffset 对象是用于处理日期和时间数据时进行时间偏移的一种工具。

以下是 DateOffset 的一些关键特性和用法:

基本概念

DateOffset 对象类似于 Timedelta,但它遵循日历中的日期时间规则,而不是直接进行时间性质的算术计算,这意味着 DateOffset 会考虑到实际的日历天数,例如在处理跨月或跨年的日期时,它会正确地计算天数差异,而 Timedelta 则是简单地加上指定的天数,不考虑月份和年份的变化。

使用方法

DateOffset 可以通过算数运算符(如 +)或 apply 方法来执行日期偏移操作。

例如,你可以这样使用 DateOffset 来增加月份或小时:

实例

ts = pd.Timestamp('2017-01-01 09:10:11')
ts + DateOffset(months=3)  # 增加三个月
ts + DateOffset(hours=2)   # 增加两小时

如果不指定任何参数,DateOffset() 默认增加一个日历日:

ts + DateOffset()  # 默认增加一天

支持的参数

DateOffset 支持多种参数,可以指定增加或替换的时间单位,如年、月、周、日、小时、分钟、秒等。这些参数可以是增加到偏移值的(如 years、months、weeks、days、hours、minutes、seconds 等),也可以是替换偏移值的(如 year、month、day、weekday、hour、minute、second 等)。

特殊方法

DateOffset 还提供了 rollforward() 和 rollback() 方法,用于将日期向前或向后滚动到最近的一个有效日期。例如,如果你使用工作日偏移(BDay),它会跳过周末,直接滚动到下一个工作日。

实例

friday = pd.Timestamp('2022-01-05')
two_business_days = 2 * pd.offsets.BDay()
friday + two_business_days  # 增加两个工作日,会跳过周末

频率字符串

DateOffset 支持频率字符串或偏移别名,可以作为 freq 参数传入。这些频率字符串表示的是 DateOffset 对象及其子类,它们定义了日期时间索引的频率。

DateOffset 是 Pandas 中处理时间序列数据时非常有用的工具,它使得日期和时间的偏移操作更加符合实际日历规则。


常用函数

DateOffset 构造函数

类/方法 描述
pd.DateOffset(**kwargs) 创建一个 DateOffset 对象,支持自定义时间偏移量。

常用 DateOffset 子类

描述
pd.offsets.Day() 表示天数的偏移量。
pd.offsets.BDay() 表示工作日的偏移量(不包括周末)。
pd.offsets.Hour() 表示小时的偏移量。
pd.offsets.Minute() 表示分钟的偏移量。
pd.offsets.Second() 表示秒数的偏移量。
pd.offsets.Milli() 表示毫秒的偏移量。
pd.offsets.Micro() 表示微秒的偏移量。
pd.offsets.MonthEnd() 表示月末的偏移量。
pd.offsets.MonthBegin() 表示月初的偏移量。
pd.offsets.YearEnd() 表示年末的偏移量。
pd.offsets.YearBegin() 表示年初的偏移量。
pd.offsets.QuarterEnd() 表示季末的偏移量。
pd.offsets.QuarterBegin() 表示季初的偏移量。
pd.offsets.Week() 表示周的偏移量。
pd.offsets.WeekOfMonth() 表示月中第几周的偏移量。

DateOffset 属性

属性 描述
DateOffset.name 返回 DateOffset 的名称。
DateOffset.n 返回或设置偏移量的数量。
DateOffset.normalize 返回或设置是否将时间标准化为午夜。

DateOffset 方法

方法 描述
DateOffset.apply(other) 将偏移量应用于另一个日期时间对象。
DateOffset.rollforward(other) 将日期向前滚动到下一个偏移量。
DateOffset.rollback(other) 将日期向后滚动到上一个偏移量。
DateOffset.is_anchored() 检查偏移量是否锚定(即是否固定频率)。
DateOffset.onOffset(date) 检查日期是否与偏移量对齐。

实例

实例

import pandas as pd
from pandas.tseries.offsets import Day, BDay, MonthEnd

# 创建 DateOffset
offset = Day(3)
print(offset)  # 输出 <3 * Days>

# 应用 DateOffset
date = pd.Timestamp('2023-01-01')
new_date = date + offset
print(new_date)  # 输出 2023-01-04

# 使用常用子类
bday_offset = BDay(2)
new_bdate = date + bday_offset
print(new_bdate)  # 输出 2023-01-05(跳过周末)

# 月末偏移量
month_end_offset = MonthEnd()
new_month_end = date + month_end_offset
print(new_month_end)  # 输出 2023-01-31

详细参数说明

pd.DateOffset()

参数 描述
years 年数偏移量。
months 月数偏移量。
weeks 周数偏移量。
days 天数偏移量。
hours 小时数偏移量。
minutes 分钟数偏移量。
seconds 秒数偏移量。
milliseconds 毫秒数偏移量。
microseconds 微秒数偏移量。
nanoseconds 纳秒数偏移量。

pd.offsets.BDay()

参数 描述
n 偏移量的数量,默认为 1。
normalize 是否将时间标准化为午夜,默认为 False

pd.offsets.MonthEnd()

参数 描述
n 偏移量的数量,默认为 1。
normalize 是否将时间标准化为午夜,默认为 False

如果需要更详细的信息,可以参考 Pandas 官方文档