Pandas resample重采样详解:降采样与升采样实战
本文深入解析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重采样内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









