【发布时间】:2021-12-10 14:37:56
【问题描述】:
我有一个名为 df 的数据集,其中包含以下列:
-
city- 计算降水的城市 -
event_timestamp- 计算降水的时间戳 -
precipitation- 降水值
我使用以下代码计算距离event_timestamp 列最近的 10 分钟标记:
df["ten_ts"] = df["event_timestamp"].dt.floor("10 min")
目标: 现在,我想从每 10 分钟点计算过去 1 小时的平均降水量。换句话说,窗口大小为 1 小时,每步移动 10 分钟,并计算该窗口内的降水平均值。我想为每个城市单独执行此操作。
我无法理解它。我尝试了以下操作,但由于明显的原因它没有给出正确的结果:
df.groupby(["city", "ten_ts"]).rolling('1h', on='event_timestamp')["precipitation_1h"].mean().reset_index()
我也尝试过使用for 循环的传统方法,但这非常慢,并且不时会杀死内核。
我们有什么方法可以在 pandas 中以高效的方式完成此任务?
编辑: 样本数据:
city event_timestamp precipitation ten_ts
0 A 2021-10-20 00:17:00.883183 0.316872 2021-10-20 00:10:00
1 A 2021-10-20 00:31:00.883183 1.159092 2021-10-20 00:30:00
2 A 2021-10-20 00:35:00.883183 0.541236 2021-10-20 00:30:00
3 A 2021-10-20 00:43:00.883183 0.152659 2021-10-20 00:40:00
4 A 2021-10-20 01:02:00.883183 1.943939 2021-10-20 01:00:00
5 A 2021-10-20 01:08:00.883183 0.493529 2021-10-20 01:00:00
6 A 2021-10-20 01:18:00.883183 0.164618 2021-10-20 01:10:00
7 A 2021-10-20 01:41:00.883183 0.710624 2021-10-20 01:40:00
8 A 2021-10-20 01:52:00.883183 3.546142 2021-10-20 01:50:00
9 A 2021-10-20 02:03:00.883183 3.177256 2021-10-20 02:00:00
10 A 2021-10-20 02:10:00.883183 0.185931 2021-10-20 02:10:00
11 A 2021-10-20 02:14:00.883183 2.581290 2021-10-20 02:10:00
12 A 2021-10-20 02:19:00.883183 0.393250 2021-10-20 02:10:00
13 A 2021-10-20 02:31:00.883183 0.189209 2021-10-20 02:30:00
14 A 2021-10-20 02:54:00.883183 1.134576 2021-10-20 02:50:00
15 A 2021-10-20 03:02:00.883183 1.449518 2021-10-20 03:00:00
16 A 2021-10-20 03:17:00.883183 0.756092 2021-10-20 03:10:00
17 A 2021-10-20 03:38:00.883183 0.620969 2021-10-20 03:30:00
18 A 2021-10-20 03:51:00.883183 0.119324 2021-10-20 03:50:00
19 A 2021-10-20 04:20:00.883183 0.937305 2021-10-20 04:20:00
20 B 2021-10-20 00:17:00.883183 0.168311 2021-10-20 00:10:00
21 B 2021-10-20 00:31:00.883183 0.681990 2021-10-20 00:30:00
22 B 2021-10-20 00:35:00.883183 1.699022 2021-10-20 00:30:00
23 B 2021-10-20 00:43:00.883183 0.871516 2021-10-20 00:40:00
24 B 2021-10-20 01:02:00.883183 1.226779 2021-10-20 01:00:00
25 B 2021-10-20 01:08:00.883183 0.266825 2021-10-20 01:00:00
26 B 2021-10-20 01:18:00.883183 2.164368 2021-10-20 01:10:00
27 B 2021-10-20 01:41:00.883183 0.906754 2021-10-20 01:40:00
28 B 2021-10-20 01:52:00.883183 0.447001 2021-10-20 01:50:00
29 B 2021-10-20 02:03:00.883183 0.945931 2021-10-20 02:00:00
30 B 2021-10-20 02:10:00.883183 0.847911 2021-10-20 02:10:00
31 B 2021-10-20 02:14:00.883183 0.134165 2021-10-20 02:10:00
32 B 2021-10-20 02:19:00.883183 0.286801 2021-10-20 02:10:00
33 B 2021-10-20 02:31:00.883183 3.113202 2021-10-20 02:30:00
34 B 2021-10-20 02:54:00.883183 0.168888 2021-10-20 02:50:00
35 B 2021-10-20 03:02:00.883183 0.596178 2021-10-20 03:00:00
36 B 2021-10-20 03:17:00.883183 0.993776 2021-10-20 03:10:00
37 B 2021-10-20 03:38:00.883183 0.142311 2021-10-20 03:30:00
38 B 2021-10-20 03:51:00.883183 0.506697 2021-10-20 03:50:00
39 B 2021-10-20 04:20:00.883183 0.125891 2021-10-20 04:20:00
编辑 2: 根据 Riley 的想法,以下是一个解决方案:
df2 = df.groupby(["city", "ten_ts"]).agg({'precipitation': ['sum', 'count']}).reset_index()
df2.columns = ["city", "ten_ts", "ppt_sum", "ppt_count"]
df3 = df2.groupby("city").rolling('1H', on="ten_ts")[["ppt_sum", "ppt_count"]].sum().reset_index()
df3["avg_ppt"] = df3["ppt_sum"] / df3["ppt_count"]
【问题讨论】:
-
你能给我们一些数据吗?
-
添加示例数据
-
我想我会尝试 1) 按 ten_ts 分组并求和 2) 按 ten_ts 分组并计数 3) 应用 1 小时滚动来求和并计数 4) 将滚动总和除以滚动计数跨度>
-
@Riley,感谢您的想法。我已为我的问题添加了解决方法。
标签: python pandas timestamp rolling-computation