首页 > 解决方案 > 如何对重叠的不规则间隔的熊猫时间序列进行重新采样

问题描述

这个 stackoverflow 问题解决了对均匀间隔的时间序列进行重叠重采样的问题。我对具有非均匀间隔数据的更一般的场景感兴趣。

考虑以下系列:

import pandas as pd

Timestamp = pd.Timestamp

d = {Timestamp('2021-08-01 00:02:01'): 92.0,
 Timestamp('2021-08-01 00:02:07'): 88.0,
 Timestamp('2021-08-01 00:03:10'): 102.0,
 Timestamp('2021-08-01 00:03:16'): 145.0,
 Timestamp('2021-08-01 00:04:28'): 102.0,
 Timestamp('2021-08-01 00:06:01'): 93.0,
 Timestamp('2021-08-01 00:07:07'): 87.0,
 Timestamp('2021-08-01 00:08:10'): 99.0,
 Timestamp('2021-08-01 00:08:16'): 136.0,
 Timestamp('2021-08-01 00:10:27'): 100.0,
 Timestamp('2021-08-01 00:12:01'): 94.0,
 Timestamp('2021-08-01 00:12:07'): 87.0,
 Timestamp('2021-08-01 00:13:10'): 97.0,
 Timestamp('2021-08-01 00:13:17'): 132.0,
 Timestamp('2021-08-01 00:13:27'): 98.0,
 Timestamp('2021-08-01 00:17:01'): 96.0,
 Timestamp('2021-08-01 00:17:07'): 91.0,
 Timestamp('2021-08-01 00:18:10'): 96.0,
 Timestamp('2021-08-01 00:18:16'): 131.0,
 Timestamp('2021-08-01 00:18:27'): 94.0}

s = pd.Series(d)

在我的情况下,我想每五分钟重新采样一次系列,这样重新采样数据的时间戳是:、、、2021-08-01 00:00:00等等2021-08-01 00:00:052021-08-01 00:00:10但是,重新采样中使用的数据窗口是六分钟长,这样就有一个分钟的原始数据重叠。(重采样间隔和重叠是变量,通常可以采用任意值。)对于这个 5 分钟和 1 分钟重叠的示例,第一个重采样间隔将跨越 00:00:00 到 00:05:59:

Timestamp('2021-08-01 00:02:01'): 92.0,
Timestamp('2021-08-01 00:02:07'): 88.0,
Timestamp('2021-08-01 00:03:10'): 102.0,
Timestamp('2021-08-01 00:03:16'): 145.0,
Timestamp('2021-08-01 00:04:28'): 102.0,

其中不包括由于重叠而产生的额外样本。第二个时间间隔从 00:05:00 到 00:10:59:

 Timestamp('2021-08-01 00:06:01'): 93.0,
 Timestamp('2021-08-01 00:07:07'): 87.0,
 Timestamp('2021-08-01 00:08:10'): 99.0,
 Timestamp('2021-08-01 00:08:16'): 136.0,
 Timestamp('2021-08-01 00:10:27'): 100.0,

由于重叠,其中包括一个额外的样本。不确定这是否重要,但我需要使用带有重采样器的自定义聚合器来计算一些百分位数。resample 调用的非重叠版本将是:

import numpy as np
agg_dict: Dict = {
    "25th Percentile": lambda x: np.quantile(x, 0.25),
    "50th Percentile": lambda x: np.quantile(x, 0.5),
    "75th Percentile": lambda x: np.quantile(x, 0.75),
}
result: pd.DataFrame = s.resample('5min').agg(agg_dict).unstack(level=0)

我认识到这可以通过 for 循环来完成,但我想知道在代码方面是否有更有效的方法。

标签: pythonpandasresamplingpandas-resample

解决方案


推荐阅读