2016-07-07 38 views
2

比方说,我有以下数据框:如何计算事件的发生之间的时间的时间序列数据帧

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 

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

+0

此行'DF ['delta_time '] =(df ['event'] - df ['event']。shift ())。fillna(0)'与您的输出或意图不匹配,因为这会减去数字的事件列 – EdChum

回答

1

我假设这是你想要什么,我不知道是否Timestamp是指数或没有,但如果它不是该指数将工作:如有需要,你需要调用reset_index

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 

恢复指数重回作为列

基本上你掩盖感兴趣的行基于在“事件”不为空,然后调用diff获得行间差异

+0

@ EdChum非常感谢。真的很感谢您的输入 – Pearl

+0

如果我的答案解决了您的问题,那么您可以接受它,我的答案左上角会有一个空的勾号标记 – EdChum