Pandas resample重采样详解:降采样与升采样实战

清欢
清欢
发布时间:2026-10-13 | 5人浏览过
原创

本文深入解析Pandas库中resample方法的使用,涵盖降采样与升采样的核心概念。通过具体代码示例,详细演示如何设置频率、处理NaN值(pad/bfill)以及应用自定义聚合函数,帮助开发者高效处理高频与低频时间序列数据转换。

Pandas resample重采样基础概念

Pandas中的resample方法用于对时间序列数据进行重新采样,即对原始样本进行重新处理。它是处理常规时间序列数据并实现频率转换的便捷工具。

降采样是指将高频数据转换为低频数据的过程。

升采样则是将低频数据转换为高频数据的过程。

核心函数为resample(),该方法适用于所有Pandas对象。

resample方法参数详解

resample方法包含多个关键参数,用于控制重采样的行为。

参数 说明
freq 表示重采样频率,例如‘M'、‘5min',Second(15)
how='mean' 用于产生聚合值的函数名或数组函数,例如‘mean'、‘ohlc'、np.max等,默认是‘mean',其他常用的值由:‘first'、‘last'、‘median'、‘max'、‘min'
axis=0 默认是纵轴,横轴设置axis=1
fill_method = None 升采样时如何插值,比如‘ffill'、‘bfill'等
closed = ‘right' 在降采样时,各时间段的哪一段是闭合的,‘right'或‘left',默认‘right'
label= ‘right' 在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:35
loffset = None 面元标签的时间校正值,比如‘-1s'或Second(-1)用于将聚合标签调早1秒
limit=None 在向前或向后填充时,允许填充的最大时期数
kind = None 聚合到时期(‘period')或时间戳(‘timestamp'),默认聚合到时间序列的索引类型
convention = None 当重采样时期时,将低频率转换到高频率所采用的约定(start或end)。默认‘end'

降采样与升采样实战代码

首先,创建一个采样频率为一分钟的Series对象作为基础数据。


>>> index = pd.date_range('1/1/2000', periods=9, freq='T')
>>> series = pd.Series(range(9), index=index)
>>> series
2000-01-01 00:00:00  0
2000-01-01 00:01:00  1
2000-01-01 00:02:00  2
2000-01-01 00:03:00  3
2000-01-01 00:04:00  4
2000-01-01 00:05:00  5
2000-01-01 00:06:00  6
2000-01-01 00:07:00  7
2000-01-01 00:08:00  8
Freq: T, dtype: int64

接下来,将采样频率降低至三分钟,实现降采样。


>>> series.resample('3T').sum()
2000-01-01 00:00:00   3
2000-01-01 00:03:00  12
2000-01-01 00:06:00  21
Freq: 3T, dtype: int64

在将频率降低至三分钟的同时,通过设置label='right',使每个时间桶中的值以右边界作为标签。请注意,桶中值的用途即为标签。


>>> series.resample('3T', label='right').sum()
2000-01-01 00:03:00   3
2000-01-01 00:06:00  12
2000-01-01 00:09:00  21
Freq: 3T, dtype: int64

继续降低采样频率至三分钟,但通过设置closed='right'来关闭右区间,从而改变聚合区间的闭合方式。


>>> series.resample('3T', label='right', closed='right').sum()
2000-01-01 00:00:00   0
2000-01-01 00:03:00   6
2000-01-01 00:06:00  15
2000-01-01 00:09:00  15
Freq: 3T, dtype: int64

将采样频率提升至30秒,实现升采样。


>>> series.resample('30S').asfreq()[0:5] #select first 5 rows
2000-01-01 00:00:00   0
2000-01-01 00:00:30  NaN
2000-01-01 00:01:00   1
2000-01-01 00:01:30  NaN
2000-01-01 00:02:00   2
Freq: 30S, dtype: float64

在将频率提升至30秒时,使用pad方法填充产生的NaN值。


>>> series.resample('30S').pad()[0:5]
2000-01-01 00:00:00  0
2000-01-01 00:00:30  0
2000-01-01 00:01:00  1
2000-01-01 00:01:30  1
2000-01-01 00:02:00  2
Freq: 30S, dtype: int64

在将频率提升至30秒时,使用bfill方法填充产生的NaN值。


>>> series.resample('30S').bfill()[0:5]
2000-01-01 00:00:00  0
2000-01-01 00:00:30  1
2000-01-01 00:01:00  1
2000-01-01 00:01:30  2
2000-01-01 00:02:00  2
Freq: 30S, dtype: int64

自定义聚合函数应用

通过apply方法运行自定义函数,实现更灵活的数据聚合。


>>> def custom_resampler(array_like):
...   return np.sum(array_like)+5
>>> series.resample('3T').apply(custom_resampler)
2000-01-01 00:00:00   8
2000-01-01 00:03:00  17
2000-01-01 00:06:00  26
Freq: 3T, dtype: int64

以上就是关于Pandas resample重采样使用的详细介绍,更多相关Pandas resample重采样内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表