python - 如何按 ID 分组,然后为每个新数据帧查找时间增量?
问题描述
我试图弄清楚如何获取我的时间序列数据帧,然后按某一列中的值分组,然后获取这些新数据帧并找出最后一个时间戳和第一个时间戳之间的差异。我无法弄清楚这是否最终需要嵌套 groupby()。我为此使用python。
我将在这里解释......我有这个数据框:
CityID Timestamp Rainfall
---------------------------------------------------------
0 222 2017-03-19 05:06:00 0
1 222 2017-03-19 05:07:00 5
2 222 2017-03-19 05:08:00 4
3 222 2017-03-19 05:09:00 0
4 222 2017-03-19 05:10:00 0
5 222 2017-03-19 05:11:00 0
6 222 2017-03-19 05:12:00 3
7 222 2017-03-19 05:13:00 3
8 222 2017-03-19 05:14:00 2
9 222 2017-03-19 05:15:00 4
10 222 2017-03-19 05:16:00 0
11 222 2017-03-19 05:17:00 5
12 222 2017-03-19 05:18:00 4
13 222 2017-03-19 05:19:00 4
14 222 2017-03-19 05:20:00 0
15 223 2017-03-19 05:09:00 0
16 223 2017-03-19 05:10:00 3
17 223 2017-03-19 05:11:00 2
18 223 2017-03-19 05:12:00 4
19 223 2017-03-19 05:15:00 0
20 223 2017-03-19 05:16:00 0
21 223 2017-03-19 05:17:00 3
22 223 2017-03-19 05:18:00 2
23 223 2017-03-19 05:19:00 3
24 223 2017-03-19 05:20:00 5
25 223 2017-03-19 05:21:00 4
26 223 2017-03-19 05:24:00 5
27 223 2017-03-19 05:27:00 3
28 223 2017-03-19 05:28:00 2
29 223 2017-03-19 05:29:00 0
我想要做的是识别每个城市的“风暴”,这里的风暴被识别为 0 之间的任何非零“降雨”值(以英寸为单位)序列。就上下文而言,这意味着我们承认暴风雨始于 0 降雨,结束于 0 降雨。如果两者之间有一个 0 值,那么这将意味着 2 个单独的风暴。在这里,是的,一场暴风雨的降雨量很少,而且只持续几分钟。我想对每个 CityID 进行分组,并生成以下数据框:
222
storm duration
-------------------
0 1
1 4
2 3
223
storm duration
-------------------
0 3
1 11
这些是我要输出的数据帧。我将更详细地解释这一点。我所做的是(或我想做的)获取我的原始数据框,按 CityID 分组,然后识别每个风暴,并给它一个 ID(例如 0、1、2 等)。然后对于每个风暴,在每个城市内,我想找到持续时间。因此,对于每个风暴,这意味着获取最后一个时间戳并减去第一个时间戳以生成每个风暴的时间增量(以分钟为单位)。这将包括 CityID 223 中的时间跳过,占缺失行的原因。(对于根据一开始的降雨量来描述风暴,我忽略了缺失的降雨数据。为了找到每个风暴的总持续时间,我假设缺失的行中的降雨量不为零。)
目标是识别每个城市的所有风暴并找到它们的持续时间。从这个输出数据框中,我希望回答“每个城市发生了多少风暴?”的研究问题。和“每次风暴持续多长时间?”
我在尝试概念化如何做到这一点时遇到了很多麻烦,虽然我认为我需要使用嵌套的 groupby,但构建代码本身确实让我感到困惑。这里有人知道怎么做吗?谢谢!
解决方案
这是我用于像您这样的分析的代码:
import numpy as np
# finding the indexes of starting/endings
start, end = np.diff(df.Rainfall !=0, prepend=False, append=False).nonzero()[0].reshape(-1, 2).T
start -= 1 # subtract 1 in order to take the first zero
在这个例子中,我使用了整个时间序列而不对城市进行分组。您可以将它们与 df.loc[df.CityID == ID_city, 'Rainfall']
推荐阅读
- intellij-idea - 为什么某些 IDE(Intellij/Android Studio)默认使用垂直线?
- linux - 命令正在终端上运行,但在 bash 脚本中没有给出语法错误
- python - 测试时间增强抛出值错误
- amazon-web-services - 为什么 AWS lambda 并发会增加调用往返时间?
- python - 快速排序不排序下半部分
- pass-by-reference - 按名称调用会影响传递给函数的参数变量,如按引用调用还是按值调用?
- r - 在没有 for 循环的情况下应用用户定义的函数
- node.js - 尝试使用 React/express 设置 Github Passport2 策略
- tabulator - 有没有办法在制表符的列中按单元格或按行设置“选择”选项?
- android - 如何在 Android API 级别 29 (>= 29) 及以上以编程方式连接到其他 Wi-fi 网络