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>
|