现在位置: 首页 > Pandas 教程 > 正文

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 官方文档。