pandas 确定事件的持续时间

unhi4e5o  于 2023-01-24  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个包含事件列表的 Dataframe ,一列表示标准的指示符,还有一列表示时间戳。
对于每个事件,如果指示符为真,我想看看事件是否持续了一个以上的周期,以及持续了多长时间。
就预期输出而言,我提供了以下示例。对于duration列,A仅在一个时间段为真,因此将编码为1。然后,A在下一个时间段为假,因此将编码为0。然后,A在两个时间段为真,因此duration为2。由于我只对第一个条目感兴趣,因此下一个条目可以编码为0,依此类推。

id  target  time                  duration
0   A   True    2023-01-22 11:00:00   1
3   A   False   2023-01-22 11:05:00   0
6   A   True    2023-01-22 11:10:00   2
9   A   True    2023-01-22 11:15:00   0
12  A   False   2023-01-22 11:20:00   0

但我不知道该怎么做。
下面包括一个 Dataframe 示例

import pandas as pd
time_test = pd.DataFrame({'id':[
    'A','B','C','A','B','C',
    'A','B','C','A','B','C',
    'A','B','C','A','B','C'],
    'target':[
        'True','True','True','False','True','True',
        'True','False','True','True','True','True',
        'False','True','False','True','False','True'],
    'time':[
        '11:00','11:00','11:00','11:05','11:05','11:05',
        '11:10','11:10','11:10','11:15','11:15','11:15',
        '11:20','11:20','11:20','11:25','11:25','11:25']})
time_test =time_test.sort_values(['id','time'])
time_test['time'] =pd.to_datetime(time_test['time'])
time_test

编辑:我需要提供一些关于预期输出的说明
让我们以B组为例。B组在11:00发生了一个事件,由target下的“True”表示。在11:05,事件仍在发生,因此对于行1 B True 2023-01-22 11:00:00,持续时间应为2。我对下面的行不感兴趣,因此可以将其编码为0。因此,在a中,since 0表示“已说明”和事件的不存在。
在11:10,该事件没有发生,因此求和将重置。
在11:15,另一个事件正在发生,而在11:20,该事件仍在继续,因此第一行的值应为2。
最后,B的值应为2,0,0,2,0,0。
我可以理解为什么这个方法会让人困惑,但我希望我的解释能让人理解。我的数据是5分钟的块,所以我想我可以只计算块的数量来看看一个事件持续了多长时间,而不是使用开始和结束时间来计算经过的时间(但也许那样会更容易?)

cwxwcias

cwxwcias1#

注解代码

# Convert the target column to boolean
mask = time_test['target'].eq('True')

# Create subgroups to identify blocks of consecutive True's
time_test['subgrps'] = (~mask).cumsum()[mask]

# Group the target mask by id and subgrps
g = mask.groupby([time_test['id'], time_test['subgrps']])

# Create a boolean mask to identify dupes per id and subgrps
dupes = time_test.duplicated(subset=['id', 'subgrps'])

# Sum the True value per group and mask the duplicates
time_test['duration'] = g.transform('sum').mask(dupes).fillna(0)

结果

id target                time  subgrps  duration
0   A   True 2023-01-22 11:00:00      0.0       1.0
3   A  False 2023-01-22 11:05:00      NaN       0.0
6   A   True 2023-01-22 11:10:00      1.0       2.0
9   A   True 2023-01-22 11:15:00      1.0       0.0
12  A  False 2023-01-22 11:20:00      NaN       0.0
15  A   True 2023-01-22 11:25:00      2.0       1.0
1   B   True 2023-01-22 11:00:00      2.0       2.0
4   B   True 2023-01-22 11:05:00      2.0       0.0
7   B  False 2023-01-22 11:10:00      NaN       0.0
10  B   True 2023-01-22 11:15:00      3.0       2.0
13  B   True 2023-01-22 11:20:00      3.0       0.0
16  B  False 2023-01-22 11:25:00      NaN       0.0
2   C   True 2023-01-22 11:00:00      4.0       4.0
5   C   True 2023-01-22 11:05:00      4.0       0.0
8   C   True 2023-01-22 11:10:00      4.0       0.0
11  C   True 2023-01-22 11:15:00      4.0       0.0
14  C  False 2023-01-22 11:20:00      NaN       0.0
17  C   True 2023-01-22 11:25:00      5.0       1.0

相关问题