【问题标题】:How to group by ID and then find time delta for each new dataframe?如何按 ID 分组,然后为每个新数据帧查找时间增量?
【发布时间】:2021-06-06 20:33:30
【问题描述】:

我试图弄清楚如何获取我的时间序列数据帧,然后按某个列中的值分组,然后获取这些新数据帧并找出最后一个时间戳和第一个时间戳之间的差异。我无法弄清楚这是否最终需要嵌套 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,但构建代码本身确实让我感到困惑。这里有人知道怎么做吗?谢谢!

【问题讨论】:

  • 按城市 ID 分组后,您可以通过以下方式创建风暴编号/标识符:1) 对每个城市数据框进行排序,2) 识别降雨量为零的记录,以及 3) 使用累积总和。例如df['storm_id'] = (df['Rainfall'] == 0).cumsum()

标签: python dataframe


【解决方案1】:

以防万一。以下是获取两个日期之间的差值的方法:

import datetime as dt

def get_delta(d1, d2):
    date1 = dt.datetime.fromisoformat(d1)
    date2 = dt.datetime.fromisoformat(d2)
    return date2 - date1

date1 = "2017-03-19 05:06:00"
date2 = "2017-03-19 05:08:00"

delta = get_delta(date1, date2)

print(delta) # Output: 0:02:00
print(delta.seconds//60) # Output: 2 (minutes)

【讨论】:

    【解决方案2】:

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

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

    分组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-14
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多