详解python重采样与频率转换之resample()

1.

rng = pd.date_range('2000-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
In [210]: ts
Out[210]: 
2000-01-01    0.631634
2000-01-02   -1.594313
2000-01-03   -1.519937
2000-01-04    1.108752
2000-01-05    1.255853
2000-01-06   -0.024330
2000-01-07   -2.047939
2000-01-08   -0.272657
2000-01-09   -1.692615
2000-01-10    1.423830
                ...   
2000-03-31   -0.007852
2000-04-01   -1.638806
2000-04-02    1.401227
2000-04-03    1.758539
2000-04-04    0.628932
2000-04-05   -0.423776
2000-04-06    0.789740
2000-04-07    0.937568
2000-04-08   -2.253294
2000-04-09   -1.772919
Freq: D, Length: 100, dtype: float64

ts.resample('M').mean()

Out[211]: 
2000-01-31   -0.165893
2000-02-29    0.078606
2000-03-31    0.223811
2000-04-30   -0.063643
Freq: M, dtype: float64

ts.resample('M', kind='period').mean()
Out[212]: 
2000-01   -0.165893
2000-02    0.078606
2000-03    0.223811
2000-04   -0.063643
Freq: M, dtype: float64
表11-5:resample方法参数

在这里插入图片描述

2. closed和lablel参数

data.set_index(['time'], inplace=True)  # 将时间设置为索引,才能进行 resample 计算
data2 = data.resample('1min', closed='left', label='left').mean()  # 以1分钟为间隔,进行采样
  • closed=‘right’ 表示:右侧是闭区间,
  • label='left’表示:将区间计算结果对应左侧

数据

rng = pd.date_range('2000-01-01', periods=12, freq='T')

ts = pd.Series(np.arange(12), index=rng)
In [215]: ts
Out[215]: 
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
2000-01-01 00:09:00     9
2000-01-01 00:10:00    10
2000-01-01 00:11:00    11
Freq: T, dtype: int64

聚合到 5min 的块内

此时默认左开,故0:00作为第一个,是开区间,只能将其归给23:55这个区间

ts.resample('5min', closed='right').sum()  # 左开右闭
Out[216]: 
1999-12-31 23:55:00     0
2000-01-01 00:00:00    15  # 01,02,03,04,05 之和
2000-01-01 00:05:00    40  # 06,07,08,09,10 之和
2000-01-01 00:10:00    11  # 11 自己
Freq: 5T, dtype: int64

你传递的频率按五分钟的增量定义了箱体边界。

默认情况下,左箱体边界是包含的,因此00:00的值是包含在00:00到00:05间隔内的,传递closed='right’将间隔的闭合端改为了右边。

产生的时间序列按照每个箱体左边的时间戳被标记。传递label='right’你可以使用右箱体边界标记时间序列:

ts.resample('5min', closed='right', label='right').sum()
Out[218]: 
2000-01-01 00:00:00     0
2000-01-01 00:05:00    15
2000-01-01 00:10:00    40
2000-01-01 00:15:00    11
Freq: 5T, dtype: int64
ts.resample('5min', closed='right', label='left').sum() 
Out[12]: 
1999-12-31 23:55:00     0
2000-01-01 00:00:00    15
2000-01-01 00:05:00    40
2000-01-01 00:10:00    11
ts.resample('5min', closed='right', label='right').agg(len)
Out[13]: 
2000-01-01 00:00:00    1
2000-01-01 00:05:00    5
2000-01-01 00:10:00    5
2000-01-01 00:15:00    1
Freq: 5T, dtype: int64
ts.resample('5min', closed='right', label='left').agg(len)
Out[14]: 
1999-12-31 23:55:00    1
2000-01-01 00:00:00    5
2000-01-01 00:05:00    5
2000-01-01 00:10:00    1
Freq: 5T, dtype: int64

下图,阐明了分钟频率数据,按五分钟频率进行的重新采样
在这里插入图片描述
最后,你可能需要将结果索引移动一定的数量,例如从右边缘减去一秒,以使其更清楚地表明时间戳所指的间隔。要实现这个功能,向loffset传递字符串或日期偏置:

ts.resample('5min', closed='right', label='right', loffset='-1s').sum()
Out[219]: 
1999-12-31 23:59:59     0
2000-01-01 00:04:59    15
2000-01-01 00:09:59    40
2000-01-01 00:14:59    11
Freq: 5T, dtype: int64

你也可以通过在结果上调用shift方法来完成loffset的效果。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重采样是指将时间序列数据从一个频率转换为另一个频率的过程。在Python中,使用pandas库可以方便地进行重采样操作。 一种常见的重采样方法是时期重采样,可以通过指定新的时间频率来重新对时期索引的数据进行分组和聚合。在pandas中,可以使用`resample`函数来进行时期重采样操作。例如,对于给定的DataFrame `frame`,我们可以使用以下代码将其重采样为年度频率: ```python annual_frame = frame.resample('A-DEC').mean() ``` 其中,`'A-DEC'`表示按年份进行重采样,`mean()`函数表示对每个年份的数据进行求均值操作。重采样后的结果将会得到一个新的DataFrame `annual_frame`,其中包含了每年的平均值。 另外,还可以使用`ffill`函数来填充缺失值,使新的日期索引与旧的索引不重叠。例如,可以使用以下代码来将DataFrame `frame`按照每周的周四进行重采样,并且通过前向填充的方式填充缺失值: ```python frame.resample('W-THU').ffill() ``` 这样,重采样后的结果将会得到一个新的DataFrame,其中的日期索引将会变为每周的周四,并且缺失值将会通过前向填充的方式进行填充。 除了时期重采样,还可以进行日期重采样。日期重采样是指将数据从低频率转换到高频率的过程。在pandas中,可以使用`resample`函数来进行日期重采样操作。例如,对于给定的DataFrame `frame`,我们可以使用以下代码将其重采样为每天的频率: ```python frame.resample('D').asfreq() ``` 其中,`'D'`表示按每天进行重采样,`asfreq()`函数表示将重采样后的数据转换频率对应的值。重采样后的结果将会得到一个新的DataFrame,其中包含了每天的数据。 总结起来,重采样是将时间序列数据从一个频率转换到另一个频率的过程。在Python中,可以使用pandas库进行重采样操作。时期重采样可以使用`resample`函数进行操作,日期重采样也可以使用`resample`函数进行操作,并且可以使用`asfreq`函数进行值的转换

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值