Timedelta 表示两个时间点之间的持续时间,精度可达纳秒,支持与时间戳、数值的复合运算。


1. 创建时间差

从字符串创建

import pandas as pd
 
pd.Timedelta('1 day')                # 1 days
pd.Timedelta('2 hours 30 minutes')   # 2 hours 30 minutes
pd.Timedelta('1 days 00:00:01')      # 1 days 00:00:01

从数值和单位创建

pd.Timedelta(10, unit='h')       # Timedelta('0 days 10:00:00')
pd.Timedelta(3600, unit='s')     # Timedelta('1 days 00:00:00')? 注意:3600秒=1小时
# 实际:pd.Timedelta(3600, unit='s') => Timedelta('0 days 01:00:00')
pd.Timedelta(1.5, unit='d')      # Timedelta('1 days 12:00:00')

使用关键字参数

pd.Timedelta(days=1, hours=2, minutes=30, seconds=10)

从 Python timedelta 创建

from datetime import timedelta
pd.Timedelta(timedelta(days=2, hours=3))

批量转换:pd.to_timedelta()

s = pd.Series(['1 day', '2 days', '3 hours'])
td_series = pd.to_timedelta(s)
 
pd.to_timedelta([1, 2, 3], unit='h')

2. 时间差属性

属性说明
.days整日数
.seconds秒数(0~86399)
.microseconds微秒数(0~999999)
.nanoseconds纳秒数(0~999)
.components各分量(天、时、分、秒、毫秒、微秒、纳秒)
.value总纳秒数(整数)
.total_seconds()总秒数(浮点)
td = pd.Timedelta(days=1, hours=2, minutes=30, seconds=45)
 
td.days           # 1
td.seconds        # 9045 (2h30m45s)
td.total_seconds()# 95445.0
td.components
# Components(days=1, hours=2, minutes=30, seconds=45, milliseconds=0, microseconds=0, nanoseconds=0)

3. 时间差运算

td1 = pd.Timedelta(days=2)
td2 = pd.Timedelta(hours=12)
 
td1 + td2    # 2 days 12:00:00
td1 - td2    # 1 days 12:00:00
td1 * 3      # 6 days
td1 / 2      # 1 days 00:00:00

与时间戳运算

ts = pd.Timestamp('2024-01-01')
ts + pd.Timedelta(days=5)   # 2024-01-06
ts - pd.Timedelta(hours=1)  # 2023-12-31 23:00:00

与数值运算(以 ns 为基准)

# 1 小时 = 3600 秒
pd.Timedelta(1, unit='h') / 60   # Timedelta('0 days 00:01:00')

4. 时间差索引(TimedeltaIndex)

idx = pd.timedelta_range(start='1 day', periods=3, freq='D')
# TimedeltaIndex(['1 days', '2 days', '3 days'], dtype='timedelta64[ns]', freq='D')
 
df = pd.DataFrame({'值': [10, 20, 30]}, index=idx)

常用属性/方法

df.index.days          # Index([1, 2, 3])
df.index.total_seconds()  # Float64Index([86400.0, 172800.0, 259200.0])
df.index.to_pytimedelta() # 转为 Python timedelta 数组

5. 时间差常用方法

方法说明
.total_seconds()总秒数
.round(freq)四舍五入到频率
.floor(freq)向下取整
.ceil(freq)向上取整
.to_pytimedelta()转 Python timedelta
.to_numpy()转 NumPy 数组
td = pd.Timedelta('1 day 03:45:00')
td.round('h')              # 1 days 04:00:00
td.floor('h')              # 1 days 03:00:00
td.ceil('h')               # 1 days 04:00:00

小结

  • Timedelta 表示持续时间,支持多种创建方式
  • 常用属性:days、seconds、components
  • 可与时间戳、数值、自身进行运算
  • TimedeltaIndex 适合作为相对时间索引