Pandas2.2 DataFrame
Time Series-related
方法 | 描述 |
---|
DataFrame.asfreq(freq[, method, how, …]) | 用于**将时间序列数据转换为指定频率(resample to frequency)**的方法 |
DataFrame.asof(where[, subset]) | 用于查找时间序列中最接近指定时间点的非 NaN 值的方法 |
DataFrame.shift([periods, freq, axis, …]) | 用于**将 DataFrame 的数据沿着指定轴移动(平移)**的方法 |
DataFrame.first_valid_index() | 用于获取 DataFrame 中第一个非空(非 NaN)值所在的行索引的方法 |
DataFrame.last_valid_index() | 用于获取 DataFrame 中最后一个非空(非 NaN)值所在的行索引的方法 |
DataFrame.resample(rule[, axis, closed, …]) | 用于**对时间序列数据进行重采样(resampling)**的核心方法 |
pandas.DataFrame.resample()
pandas.DataFrame.resample()
是 Pandas 中用于**对时间序列数据进行重采样(resampling)**的核心方法。它类似于 SQL 中的“GROUP BY 时间窗口”操作,常用于将高频时间序列数据聚合为低频(如从分钟级到小时级、日级等),也支持升采样(插值填充)。
📌 方法签名
DataFrame.resample(rule,axis=0,closed=None,label=None,convention='start',kind=None,on=None,level=None,origin='start_day',offset=None,group_keys=False
)
🔧 参数说明:
参数 | 说明 |
---|
rule | 时间频率字符串,如 'D' (天)、'W' (周)、'M' (月)、'Q' (季度)、'A' (年)等 |
axis | 操作轴方向,默认为 0 (行方向) |
closed | 区间闭合方式,可选 'left' 或 'right' ,表示区间端点是否包含 |
label | 聚合后标签的位置,可选 'left' 或 'right' |
convention | 升采样时的时间点对齐方式,如 'start' , 'end' (默认 'start' ) |
kind | 返回类型,可选 'period' 或 'timestamp' |
on | 对非索引的时间列进行 resample(适用于普通列而非 DatetimeIndex) |
level | 多级索引中指定某一级作为时间索引 |
origin | 起始时间对齐方式,可选 'epoch' 或 'start_day' (默认) |
offset | 时间偏移量,如 '1D' 表示起始时间向后偏移一天 |
group_keys | 是否在分组键中显示时间标签(一般不需修改) |
✅ 返回值
- 返回一个
Resampler
对象,需要配合 .mean()
, .sum()
, .max()
等聚合函数使用; - 原始数据不会被修改;
🧪 示例代码及结果
示例 1:基本用法(按天聚合)
import pandas as pd
import numpy as np
index = pd.date_range('2025-01-01', periods=6, freq='H')
df = pd.DataFrame({'value': [10, 20, 30, 40, 50, 60]
}, index=index)print("Original DataFrame:")
print(df)
输出:
value
2025-01-01 00:00:00 10
2025-01-01 01:00:00 20
2025-01-01 02:00:00 30
2025-01-01 03:00:00 40
2025-01-01 04:00:00 50
2025-01-01 05:00:00 60
resampled = df.resample('2H').mean()
print("\nAfter resample('2H').mean():")
print(resampled)
输出:
value
2025-01-01 00:00:00 15.0
2025-01-01 02:00:00 35.0
2025-01-01 04:00:00 55.0
示例 2:按天聚合并求和
resampled = df.resample('D').sum()
print("\nAfter resample('D').sum():")
print(resampled)
输出:
value
2025-01-01 210
示例 3:自定义闭合方式与标签位置
resampled = df.resample('2H', closed='right', label='right').mean()
print("\nresample('2H', closed='right', label='right'):")
print(resampled)
输出:
value
2025-01-01 02:00:00 15.0
2025-01-01 04:00:00 35.0
2025-01-01 06:00:00 55.0
示例 4:升采样 + 插值填充(ffill
)
resampled = df.resample('30T').ffill()
print("\nresample('30T').ffill():")
print(resampled)
输出(部分):
value
2025-01-01 00:00:00 10
2025-01-01 00:30:00 10
2025-01-01 01:00:00 20
2025-01-01 01:30:00 20
2025-01-01 02:00:00 30
...
示例 5:使用 on=
指定时间列进行 resample
df_reset = df.reset_index()
df_reset.rename(columns={'index': 'timestamp'}, inplace=True)
resampled = df_reset.resample('2H', on='timestamp').mean()
print("\nresample(..., on='timestamp').mean():")
print(resampled)
输出:
value
timestamp
2025-01-01 00:00:00 15.0
2025-01-01 02:00:00 35.0
2025-01-01 04:00:00 55.0
示例 6:使用 kind='period'
返回 Period 类型
resampled = df.resample('2H', kind='period').mean()
print("\nresample(..., kind='period').mean():")
print(resampled)
输出:
value
timestamp
2025-01-01 00:00 15.0
2025-01-01 02:00 35.0
2025-01-01 04:00 55.0
🧠 应用场景
场景 | 说明 |
---|
时间序列聚合 | 如计算每日/每周/每月的均值、总和等 |
降采样(Downsampling) | 将高频率数据转换为低频率(如秒级 → 分钟级) |
升采样(Upsampling) | 将低频率数据转换为高频率(如日级 → 小时级),通常结合 .interpolate() 或 .ffill() |
缺失值处理 | 在升采样后填充缺失值 |
可视化准备 | 统一时间粒度便于绘图分析 |
⚠️ 注意事项
- 必须确保索引或指定列为
DatetimeIndex
类型; resample()
不会直接返回结果,必须配合聚合函数(如 .mean()
, .sum()
);- 支持多种频率规则,如:
'T'
/ 'min'
:分钟'H'
:小时'D'
:天'W'
:周'M'
:月末'Q'
:季度末'A'
:年末
closed
和 label
控制时间区间的划分方式;origin
可控制时间窗口起点;offset
可设置时间窗口偏移(如从 1:30 开始);on=
可用于对非索引的时间列进行 resample。
✅ 总结对比
方法 | 是否聚合 | 是否支持升采样 | 是否支持降采样 | 是否支持非索引时间列 |
---|
.resample() | ✅ | ✅ | ✅ | ✅(通过 on= ) |
.asfreq() | ❌ | ✅ | ✅ | ❌ |
.rolling() | ✅ | ❌ | ✅ | ✅ |
.groupby(pd.Grouper(freq='D')) | ✅ | ✅ | ✅ | ✅ |
📈 频率规则参考表(常用)
规则 | 含义 |
---|
'T' / 'min' | 每分钟 |
'H' | 每小时 |
'D' | 每天 |
'W' | 每周(默认周日为一周开始) |
'M' | 每月最后一天 |
'Q' | 每季度最后一天 |
'A' | 每年最后一天 |
'MS' | 每月初第一天 |
'QS' | 每季度初第一天 |
'AS' | 每年初第一天 |
✅ 推荐组合使用方式
df.resample('D').mean()
df.resample('T').ffill()
df.resample('T').interpolate('linear')
如果你希望对时间序列进行降采样统计、升采样插值、或统一时间粒度,resample()
是非常强大且灵活的工具,是时间序列分析中的核心方法之一。