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)
参数详解是:
参数 | 说明 |
---|
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' |
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,l然后聚合成左闭右开的5个区间[1,8),[8,15),[15,22),[22-29),[29-5(下个月)),每个区间的值就为单个区间值之和。由于29号往后只有29号和30号有值,所以只有两个值
下面我们看看label和closed的功能
1 2 3 4 5 6 7 8 9 10 | ts_7d = ts.resample( '7D' ,closed = 'right' ,label = 'left' ). sum () ts_7d <p>Out[ 14 ]:<br> 2017 - 12 - 25 1 <br> 2018 - 01 - 01 35 <br> 2018 - 01 - 08 84 <br> 2018 - 01 - 15 133 <br> 2018 - 01 - 22 182 <br> 2018 - 01 - 29 30 <br> < / p> |
上面的代码,将closed改为了right,区间就变成了左开右闭,那么如果从区间还是(1,8],1就取不到,所以往前取,就是(25,1],(1,8],(8,15],(15,22],(22,29],(29,5]这6个区间
1 2 3 4 5 6 7 8 9 10 11 | ts_7d = ts.resample( '7D' ,closed = 'right' ,label = 'right' ). sum () ts_7d <p>Out[ 15 ]:<br> 2018 - 01 - 01 1 <br> 2018 - 01 - 08 35 <br> 2018 - 01 - 15 84 <br> 2018 - 01 - 22 133 <br> 2018 - 01 - 29 182 <br> 2018 - 02 - 05 30 <br> dtype: int32<br> < / p> |
上面的代码就可以看出label=right就是指label等于区间右边的值,如果label=left就是指label等于区间左边的值。
重采样
降低时间的细粒度,对于重采样,主要是涉及到值的填充。有下面的三种填充方法:
不填充:那么对应无值的地方,用NaN代替。对应的方法是asfreq。
用前值填充:用前面的值填充无值的地方。对应的方法是ffill或者pad。
用后值填充:对应的方法是bfill,b代表back。
下面给出代码看一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ts_7h_asfreq = ts.resample( '7H' ).asfreq() ts_7h_asfreq.head(4) ts_7h_ffill = ts.resample( '7H' ).ffill() ts_7h_ffill.head(4) ts_7h_bfill = ts.resample( '7H' ).bfill() ts_7h_bfill.head(4) Out[ 15 ]: 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 <br> 2018 - 01 - 01 07 : 00 : 00 1 <br> 2018 - 01 - 01 14 : 00 : 00 1 <br> 2018 - 01 - 01 21 : 00 : 00 1 <br> Freq: 7H , dtype: int32<br> 2018 - 01 - 01 00 : 00 : 00 1 <br> 2018 - 01 - 01 07 : 00 : 00 2 <br> 2018 - 01 - 01 14 : 00 : 00 2 <br> 2018 - 01 - 01 21 : 00 : 00 2 <br> Freq: 7H , dtype: int32<br> |