我正在尝试弄清楚如何获取我的时间序列数据帧,然后按特定列中的值进行分组,然后获取这些新的数据帧并找出最后一个和第一个时间戳之间的差异。我不知道这最终是否需要一个嵌套的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值,那么这将意味着两个独立的风暴。在这里,是的,一场风暴可以有最小的降雨量,并且只持续几分钟。我想按每个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,但构造代码本身确实让我感到困惑。在座有人知道怎么做吗?谢谢!
发布于 2021-06-07 05:40:51
以防万一。下面是获取两个日期之间的增量的方法:
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)https://stackoverflow.com/questions/67863504
复制相似问题