Pandas中的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)

参数详解是:

参数说明
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>

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值