说明
pandas 中核心的时间对象有五种:
Timestamp、Timedelta、Period、DateOffset和NaT,分别用于表示时刻、时间差、周期区间、日历偏移与缺失时间。
Timestamp
说明
表示单个时间戳,是 Python
datetime.datetime的 pandas 替代品,基于numpy.datetime64实现,支持高精度与向量化运算。
import pandas as pd
ts = pd.Timestamp('2026-08-19 13:05:30')
print(ts)
# 2026-08-19 13:05:30
# 属性
print(ts.year, ts.month, ts.day) # 2026 8 19
print(ts.hour, ts.minute, ts.second) # 13 5 30
print(ts.dayofweek, ts.dayofyear, ts.quarter) # 2 231 3
# 方法
print(ts.to_pydatetime()) # 转 Python datetime
print(ts.strftime('%Y/%m/%d')) # 2026/08/19
print(ts.timestamp()) # Unix 时间戳(浮点)
print(ts.to_period('M')) # 2026-08Timedelta
说明
表示时间差或持续时间,基于
numpy.timedelta64实现,支持与Timestamp的加减运算。
td = pd.Timedelta(days=3, hours=5, minutes=30, seconds=15)
print(td)
# 3 days 05:30:15
# 属性
print(td.days) # 3
print(td.seconds) # 19815(当天内的秒数)
print(td.microseconds) # 0
print(td.nanoseconds) # 0
print(td.components) # Components(days=3, hours=5, minutes=30, seconds=15, ...)
print(td.total_seconds()) # 286215.0(总秒数)
# 方法
print(td.to_pytimedelta()) # 转 Python timedelta
print(td.round('h')) # 3 days 05:00:00
print(td.floor('h')) # 3 days 05:00:00
print(td.ceil('h')) # 3 days 06:00:00Period
说明
表示固定频率的时间区间(如一个月、一个季度、一年),比
Timestamp更适合周期类数据分析,且支持频率感知的算术运算。
p = pd.Period('2026-08', freq='M')
print(p)
# 2026-08
# 属性
print(p.freq) # <MonthEnd>
print(p.start_time) # 2026-08-01 00:00:00
print(p.end_time) # 2026-08-31 23:59:59.999999999
print(p.year, p.month, p.quarter) # 2026 8 3
print(p.day, p.hour, p.minute, p.second) # 31 23 59 59(区间末端组件)
print(p.week, p.dayofweek, p.dayofyear) # 35 2 231(示例值)
print(p.days_in_month) # 31
# 方法
print(p.to_timestamp()) # 2026-08-01 00:00:00
# 频率感知算术
print(p + 1) # 2026-09
print(p - 3) # 2026-05Period 与 Timestamp 区别
Timestamp:时间轴上的一个点。Period:时间轴上的一段区间,加减运算自动处理频率边界(如月份长度差异)。
DateOffset
说明
表示日历相关的偏移量,遵循日历规则(如月末、工作日、节假日),与
Timedelta的固定长度有本质区别。
from pandas.tseries.offsets import DateOffset
# 月份偏移:1 月 31 日加 1 个月自动落到 2 月末
print(pd.Timestamp('2026-01-31') + DateOffset(months=1))
# 2026-02-28 00:00:00
# 组合偏移
offset = DateOffset(years=1, months=2, days=3, hours=4)
print(pd.Timestamp('2026-08-19 13:05:00') + offset)
# 2027-10-22 17:05:00
# DateOffset 也用于固定频率(如每小时、每 90 分钟)
print(pd.Timestamp('2026-08-19') + DateOffset(hours=90))
# 2026-08-23 18:00:00DateOffset 与 Timedelta
Timedelta是绝对时长:1 天恒为 86400 秒。DateOffset是日历时长:1 个月可能是 28、29、30 或 31 天。
NaT
说明
NaT(Not a Time)是时间序列中的缺失值标识,相当于数值数据中的NaN,用于Timestamp、DatetimeIndex、Timedelta等时间数据。
print(pd.NaT) # NaT
print(pd.isna(pd.NaT)) # True
print(pd.isna(pd.Timestamp('2026-01-01'))) # False
# 在 Series 中识别缺失时间
s = pd.Series([pd.Timestamp('2026-01-01'), pd.NaT, None])
print(pd.isna(s))
# 0 False
# 1 True
# 2 True
# dtype: bool
# 缺失值在运算中传播
print(pd.Timestamp('2026-01-01') + pd.NaT) # NaT
print(pd.Timedelta(days=1) + pd.NaT) # NaT注意
pd.NaT的==比较返回False(与np.nan行为一致),判断缺失必须使用pd.isna()/pd.notna()。
🔗 相关链接
- 9.2 创建方法 - 批量创建时间对象
- 9.4 .dt 访问器 - 提取时间组件
- 数据类型与扩展数组- datetime64、timedelta64、period[D] 数据类型