Pandas中resample方法详解
本文详细解析Pandas库中resample方法的使用。涵盖降采样与升采样的具体操作,包括频率调整、区间闭合规则(closed)、标签设置(label)以及NaN值填充策略(pad/bfill)。通过Series示例展示如何应用自定义函数,帮助开发者掌握时间序列数据的高效处理技巧。
resample方法概述
Pandas中的resample方法用于对常规时间序列数据进行重新采样和频率转换,是对原始样本进行重新处理的有效工具。
方法格式与参数详解
该方法的基本调用格式如下所示:
DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start',kind=None, loffset=None, limit=None, base=0)
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' |
重采样操作示例
首先,我们创建一个采样频率为1分钟(T)的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
接下来,演示如何将采样频率降低至3分钟(3T),默认情况下会对每个区间内的数据进行求和。
>>> 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
在将频率降低至3分钟的同时,可以通过设置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
进一步调整频率至3分钟,并设置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秒(30S),这属于升采样操作,原始数据点之间的空缺位置会显示为NaN。
>>> 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方法的核心用法,希望能为读者的数据处理工作提供有益参考。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









