如何计算时间序列数据框中事件发生之间的时间

How to calculate time between occurrence of an event in a timeseries dataframe

假设我有以下数据框:

df
                       A     B      C    D   event  
Timestamp                                                      
1991-04-21 09:09:00   9.0  13.0    NaN  NaN  100.0     
1991-04-21 17:08:00   7.0   NaN    NaN  NaN  119.0     
1991-04-21 22:51:00   NaN   NaN  123.0  NaN    NaN     
1991-04-22 07:35:00  10.0  13.0    NaN  NaN  216.0     
1991-04-22 13:40:00   2.0   NaN    NaN  NaN    NaN     
1991-04-22 16:56:00   7.0   NaN    NaN  NaN  211.0  

使用代码

df['delta_time'] = (df['event']-df['event'].shift()).fillna(0) 

我明白了

Timestamp             A     B      C    D    event     delta_time 

1991-04-21 09:09:00   9.0  13.0    NaN  NaN  100.0     00:00:00
1991-04-21 17:08:00   7.0   NaN    NaN  NaN  119.0     07:59:00
1991-04-21 22:51:00   NaN   NaN  123.0  NaN    NaN     05:43:00
1991-04-22 07:35:00  10.0  13.0    NaN  NaN  216.0     08:44:00
1991-04-22 13:40:00   2.0   NaN    NaN  NaN    NaN     06:05:00
1991-04-22 16:56:00   7.0   NaN    NaN  NaN  211.0     03:16:00
1991-04-23 07:25:00  11.0  13.0    NaN  NaN  257.0     14:29:00

但我要找的是

Timestamp                                                      
1991-04-21 09:09:00   9.0  13.0    NaN  NaN  100.0     00:00:00
1991-04-21 17:08:00   7.0   NaN    NaN  NaN  119.0     07:59:00
1991-04-21 22:51:00   NaN   NaN  123.0  NaN    NaN     NaN
1991-04-22 07:35:00  10.0  13.0    NaN  NaN  216.0     13:42:00
1991-04-22 13:40:00   2.0   NaN    NaN  NaN    NaN     NaN
1991-04-22 16:56:00   7.0   NaN    NaN  NaN  211.0     09:21:00
1991-04-23 07:25:00  11.0  13.0    NaN  NaN  257.0     14:29:00

我想计算每次事件发生时经过的时间,并忽略事件为 NaN 的时间。那么编写该代码的正确方法是什么。

我假设这就是你想要的,我不知道 Timestamp 是否是索引,但如果它不是索引,这将起作用:

In [251]:
df['delta_time'] = df.loc[df['event'].notnull(),'Timestamp'].diff()
df

Out[251]:
            Timestamp     A     B      C   D  event  delta_time
0 1991-04-21 09:09:00   9.0  13.0    NaN NaN  100.0         NaT
1 1991-04-21 17:08:00   7.0   NaN    NaN NaN  119.0    07:59:00
2 1991-04-21 22:51:00   NaN   NaN  123.0 NaN    NaN         NaT
3 1991-04-22 07:35:00  10.0  13.0    NaN NaN  216.0    14:27:00
4 1991-04-22 13:40:00   2.0   NaN    NaN NaN    NaN         NaT
5 1991-04-22 16:56:00   7.0   NaN    NaN NaN  211.0    09:21:00

如果需要,您需要调用 reset_index 将索引恢复为列

基本上,您根据 'event' 不为空的位置屏蔽感兴趣的行,然后调用 diff 以获得行间差异