Разница во времени между двумя строками событий для каждого пользователя в Pandas df - PullRequest
2 голосов
/ 10 марта 2020

У меня есть следующий фрейм данных:

    imei    event_type               time   
    1107    alarm                    2020-01-28 11:32:42+00:00  
    1107    alarm_restored           2020-01-28 11:32:53+00:00
    1107    alarm_emergency          2020-01-28 11:33:03+00:00  
    1107    alarm_emergency_restored 2020-01-28 11:33:06+00:00
    1108    alarm                    2020-01-28 11:42:42+00:00  
    1108    alarm_restored           2020-01-28 11:43:53+00:00
    1109    alarm_emergency          2020-01-28 11:53:23+00:00  
    1109    alarm_emergency          2020-01-28 11:53:23+00:00  
    1109    alarm_emergency_restored 2020-01-28 11:57:06+00:00  
    1110    alarm_emergency          2020-01-29 10:23:05+00:00  
    1111    alarm_restored           2020-01-29 11:10:53+00:00  
    1112    alarm_emergency_restored 2020-01-29 12:13:23+00:00  

Я хочу найти разницу во времени между событиями тревоги и восстановленного типа для каждого пользователя. Я понятия не имею, как поступить с этим. Я попытался вычислить разницу во времени между двумя последовательными строками в pandas Я попытался

    df_alarm['time'].diff(3)

и получил:

    0                              NaT
    1                              NaT
    2                              NaT
    3           0 days 00:00:23.706000
    4           0 days 00:27:28.364000
    ...

Это не так, как я ожидал Результаты. Я хочу получить результаты в минутах / секундах

ОБНОВЛЕНИЕ:

Я хочу найти разницу во времени для каждого последовательного сигнала тревоги и alarm_restored, alarm_emergency и alarm_emergency_restored, только если они являются последовательными строками. Все остальные строки должны быть NaT.

Ожидаемый результат:

    imei    event_type               time                       time_diff
    1107    alarm                    2020-01-28 11:32:42+00:00  NaT
    1107    alarm_restored           2020-01-28 11:32:53+00:00  00:00:11
    1107    alarm_emergency          2020-01-28 11:33:03+00:00  NaT
    1107    alarm_emergency_restored 2020-01-28 11:33:06+00:00  00:00:03
    1108    alarm                    2020-01-28 11:42:42+00:00  NaT
    1108    alarm_restored           2020-01-28 11:43:53+00:00  00:01:11
    1109    alarm_emergency          2020-01-28 11:14:27+00:00  NaT
    1109    alarm_emergency          2020-01-28 11:53:23+00:00  NaT
    1109    alarm_emergency_restored 2020-01-28 11:57:06+00:00  00:03:43
    1110    alarm_emergency          2020-01-29 10:23:05+00:00  NaT
    1111    alarm_restored           2020-01-29 11:10:53+00:00  NaT
    1112    alarm_emergency_restored 2020-01-29 12:13:23+00:00  NaT

Как видите, если есть два последовательных события alarm_ * и одно восстановление после этого (как в строках 1109-1109) Я хочу найти разницу только между строкой 2 и строкой 3 для 1109.

1 Ответ

0 голосов
/ 10 марта 2020

Это будет работать.

Сначала вы получите разницу во времени между всеми строками.

df["timediff"] = df.groupby(df.imei)["time"].diff()

Затем вы просто установите значение времени в NaT (не время) для всех строк, которые не "* _restored", потому что вас не волнует время от "* _restored" до любых других событий тревоги:

import numpy as np
df["timediff"][df.event_type.str.contains("restored") == False] = np.datetime64('NaT')

Это дает именно то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...