首页 > 解决方案 > 如何按 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,但构建代码本身确实让我感到困惑。这里有人知道怎么做吗?谢谢!

标签: pythondataframe

解决方案


这是我用于像您这样的分析的代码:

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']


推荐阅读