Python Pandas resample函数详解:降采样与重采样实战
本文详细介绍Python Pandas中resample函数的用法,涵盖降采样与重采样两种场景。通过示例解析rule、closed、label等关键参数对区间划分的影响,并对比asfreq、ffill、bfill三种重采样填充策略,帮助开发者掌握时间序列数据的聚合与插值技巧。
resample函数原型与关键参数
函数原型
resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start', kind=None, loffset=None, limit=None, base=0, on=None, level=None)
其中,rule、closed和label是几个关键参数,下文将通过具体用法进行说明。
降采样:区间聚合与参数控制
降采样
降采样旨在增大时间数据的细粒度间隔,例如将每日数据聚合为每周数据。聚合方式通常包括求和或计算均值。
以下提供具体示例。
times=pd.date_range('20180101',periods=30)
ts=pd.Series(np.arange(1,31),index=times)
ts
2018-01-01 1
2018-01-02 2
2018-01-03 3
2018-01-04 4
2018-01-05 5
2018-01-06 6
2018-01-07 7
2018-01-08 8
2018-01-09 9
2018-01-10 10
2018-01-11 11
2018-01-12 12
2018-01-13 13
2018-01-14 14
2018-01-15 15
2018-01-16 16
2018-01-17 17
2018-01-18 18
2018-01-19 19
2018-01-20 20
2018-01-21 21
2018-01-22 22
2018-01-23 23
2018-01-24 24
2018-01-25 25
2018-01-26 26
2018-01-27 27
2018-01-28 28
2018-01-29 29
2018-01-30 30
Freq: D, dtype: int32
ts_7d=ts.resample('7D').sum()
ts_7d
2018-01-01 28
2018-01-08 77
2018-01-15 126
2018-01-22 175
2018-01-29 59
dtype: int32
观察上述代码,首先创建一个包含1日至30日数据的Series,随后将其聚合为左闭右开的5个区间:[1, 8)、[8, 15)、[15, 22)、[22, 29)以及[29, 5(下个月))。每个区间的值为该区间内单个值的总和。由于29日之后仅有29日和30日有数据,因此最终结果仅包含两个有效值。
接下来分析closed和label参数的功能。
ts_7d=ts.resample('7D',closed='right',label='left').sum()
ts_7d
Out[14]:
2017-12-25 1
2018-01-01 35
2018-01-08 84
2018-01-15 133
2018-01-22 182
2018-01-29 30
在上述代码中,将closed参数修改为right后,区间类型变为左开右闭。此时区间变为(1, 8],由于1日不在区间内,数据向前延伸,形成的区间依次为(25, 1]、(1, 8]、(8, 15]、(15, 22]、(22, 29]和(29, 5],共6个区间。
ts_7d=ts.resample('7D',closed='right',label='right').sum()
ts_7d
Out[15]:
2018-01-01 1
2018-01-08 35
2018-01-15 84
2018-01-22 133
2018-01-29 182
2018-02-05 30
dtype: int32
从上述代码可以看出,label='right'表示标签取右区间的值,而label='left'则表示标签取左区间的值。
重采样:缺失值填充策略
重采样
重采样用于降低时间细粒度,主要涉及缺失值的填充处理。以下是三种常见的填充方法。
不填充。对于无值的位置,使用NaN代替,对应的方法为asfreq。
使用前值填充。利用前一个有效值填充缺失位置,对应的方法为ffill或pad。
使用后值填充。对应的方法为bfill,其中b代表back。
以下通过代码展示具体效果。
ts_7h_asfreq = ts.resample('7H').asfreq()
print(ts_7h_asfreq)
ts_7h_ffill = ts.resample('7H').ffill()
print(ts_7h_ffill)
ts_7h_bfill = ts.resample('7H').bfill()
ts_7h_bfill
2018-01-01 00:00:00 1.0
2018-01-01 07:00:00 NaN
2018-01-01 14:00:00 NaN
2018-01-01 21:00:00 NaN
Freq: 7H, dtype: float64
2018-01-01 00:00:00 1
2018-01-01 07:00:00 1
2018-01-01 14:00:00 1
2018-01-01 21:00:00 1
Freq: 7H, dtype: int32
Out[24]:
2018-01-01 00:00:00 1
2018-01-01 07:00:00 2
2018-01-01 14:00:00 2
2018-01-01 21:00:00 2
Freq: 7H, dtype: int32
总结
重采样和降采样通常应用于时间序列分析中。合理使用这些方法降低时间维度或细粒度,有助于构建更优质的特征。
以上关于Python中resample函数实现重采样和降采样的内容即为分享的全部信息,希望能对大家有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













