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的效果。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐