Pandas 重叠重采样

Pandas resample with overlap

我想对我的时间索引 DataFrame 进行一些重叠的重采样。

例如:

>>> df
                     data
date                     
2018-03-09 12:00:00     1
2018-03-09 12:00:01     1
2018-03-09 12:00:02     1
2018-03-09 12:00:03     1
2018-03-09 12:00:04     1
2018-03-09 12:00:05     1
2018-03-09 12:00:06     1
2018-03-09 12:00:07     1
2018-03-09 12:00:08     1
2018-03-09 12:00:09     1
2018-03-09 12:00:10     1
2018-03-09 12:00:11     2
2018-03-09 12:00:12     2
2018-03-09 12:00:13     2
2018-03-09 12:00:14     2
2018-03-09 12:00:15     2
2018-03-09 12:00:16     2
2018-03-09 12:00:17     2
2018-03-09 12:00:18     2
2018-03-09 12:00:19     2
2018-03-09 12:00:20     2
2018-03-09 12:00:21     3
2018-03-09 12:00:22     3
2018-03-09 12:00:23     3
2018-03-09 12:00:24     3
2018-03-09 12:00:25     3
2018-03-09 12:00:26     3
2018-03-09 12:00:27     3
2018-03-09 12:00:28     3
2018-03-09 12:00:29     3
2018-03-09 12:00:30     3

重采样 10 秒和 2 秒重叠后的结果应该如下所示:

>>> df
                     data
date                     
2018-03-09 12:00:10     14
2018-03-09 12:00:20     28
2018-03-09 12:00:30     34

我尝试过分组,但在大数据集上速度非常慢。

有没有快速有效的方法来实现?

假设您的数据是规则间隔的,您可以 concat 移位的系列,然后求和。

N = 10  # Every 10 seconds from first row
ov = 2  # 2s overlap on either side

pd.concat([df.shift(i).iloc[::N] for i in range(-ov, N+ov)], axis=1).sum(1)

date
2018-03-09 12:00:00     3.0
2018-03-09 12:00:10    15.0
2018-03-09 12:00:20    28.0
2018-03-09 12:00:30    34.0
dtype: float64

对于多列,将其转换为沿列轴的 groupby

df['data2'] = df['data']+1  # Another column

(pd.concat([df.shift(i).iloc[::N] for i in range(-ov, N+ov)], axis=1)
   .groupby(level=0, axis=1).sum())

                     data  data2
date                            
2018-03-09 12:00:00   3.0    6.0
2018-03-09 12:00:10  15.0   28.0
2018-03-09 12:00:20  28.0   42.0
2018-03-09 12:00:30  34.0   46.0