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

时间:2016-07-07 08:44:42

标签: pandas time-series timedelta

假设我有以下数据框:

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的时间。那么编写该代码的正确方法是什么。

1 个答案:

答案 0 :(得分:2)

我假设这是你想要的,我不知道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将索引恢复为列

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