我有一个数据框如下:
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/