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()
是非常强大且灵活的工具,是时间序列分析中的核心方法之一。