详解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
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的效果。
更多推荐
已为社区贡献28条内容
所有评论(0)