python - 如何对重叠的不规则间隔的熊猫时间序列进行重新采样
问题描述
这个 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:05
。2021-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 循环来完成,但我想知道在代码方面是否有更有效的方法。
解决方案
推荐阅读
- r - 如何根据唯一用户 ID 和特定事件类型创建 for 循环
- twitter-bootstrap - 之间的区别:输入组前置和附加?(BS4)
- c# - 如何冻结集合以便可以迭代它?
- c - 避免无限的while循环
- mysql - SQL WHERE 过滤
- java - 获取活动 system.out 打印流列表
- angular - 在 Angular 5 中动态添加元描述
- vbscript - 在 vbScript 中安排要在(任何用户)登录时执行的任务
- r - 警告:aggregate.data.frame 中的错误:参数必须具有相同的长度堆栈跟踪(最里面的第一个)
- angularjs - 找不到我的退货被序列化两次的原因