2016-07-07 1 views
2

Disons que je l'dataframe suivante:Comment calculer le temps entre l'apparition d'un événement dans une trame de données de série chronologique

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 

utilisant le code

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

Je reçois

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 

mais ce que je cherche est

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 

Je veux calculer le temps qui s'est écoulé chaque fois qu'un événement se produit et omettre les moments où l'événement était un NaN. Alors, quelle serait la bonne approche pour écrire ce code.

+0

cette ligne 'df [ 'delta_time '] = (df [' event '] - df [' event ']. shift()). fillna (0) 'ne correspond pas à votre sortie ou votre intention, car cela soustrait la colonne d'événement qui est numérique – EdChum

Répondre

1

Je suppose c'est ce que vous voulez, je ne sais pas si Timestamp est l'indice ou non, mais cela ne fonctionnera pas si elle est l'indice:

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 

si nécessaire, vous devez appeler reset_index pour restaurer l'index de retour en tant que colonne

essentiellement vous masque les lignes d'intérêt en fonction de l'endroit où le « événement » est non nul, puis appelez diff pour obtenir la différence entre les rangs

+0

@ EdChum Merci beaucoup. Vraiment apprécier votre contribution – Pearl

+0

Si ma réponse a résolu votre question, alors vous pouvez l'accepter il y aura une coche vide en haut à gauche de ma réponse – EdChum