python - Pandas df 中每个用户的两个事件行之间的时间差

标签 python pandas dataframe

我有一个数据框如下:

    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  

我想找出每个用户的警报和恢复类型事件之间的时间差。 我不知道如何进行。 我试过 calculate the time difference between two consecutive rows in 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 行),我只想找出 1109 的第 2 行和第 3 行之间的差异。

最佳答案

这会起作用。

首先你得到所有行之间的时间差。

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

然后,您只需将非“*_restored”的所有行的 timediff 设置为 NaT(不是时间),因为您不关心从“*_restored”到任何其他警报事件的时间:

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

这正是您想要的。

关于python - Pandas df 中每个用户的两个事件行之间的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60625263/

相关文章:

python - QProcess 无法写入 cmd.exe

python - 将 Python 解释器放入 Beamer 幻灯片中

Python列表理解: populating each inner-list with two variables

python - Pandas 根据日期范围和另一列过滤数据框

python - 如何从html中提取数字?

python - df_dates = df.loc[ :, "Date"] 无法读取 'Date' 列(数据来自 yahoo Fin)

python - Pandas pivot 或 groupby 用于动态生成的列

python - 首先对较高层的数据帧进行排名,然后对较低层的数据帧进行排名

python - 在 pandas 的列中获取具有相同值的行

python - 输入提示数据帧联合的最佳方法