web-dev-qa-db-fra.com

Comment calculer le décalage horaire par groupe à l'aide de pandas?

Problème

Je veux calculer diff par groupe. Et je ne sais pas comment trier la colonne time pour que les résultats de chaque groupe soient triés et positifs.

Les données d'origine:

In [37]: df 
Out[37]:
  id                time
0  A 2016-11-25 16:32:17
1  A 2016-11-25 16:36:04
2  A 2016-11-25 16:35:29
3  B 2016-11-25 16:35:24
4  B 2016-11-25 16:35:46

Le résultat que je veux

Out[40]:
   id   time
0  A   00:35
1  A   03:12
2  B   00:22

remarque: le type de temps col est timedelta64 [ns]

En essayant

In [38]: df['time'].diff(1)
Out[38]:
0                 NaT
1            00:03:47
2   -1 days +23:59:25
3   -1 days +23:59:55
4            00:00:22
Name: time, dtype: timedelta64[ns]

N'obtenez pas le résultat souhaité.

Espérer

Non seulement le problème est résolu, mais le code peut s'exécuter rapidement car il y a 50 millions de lignes.

18
Jack

Vous pouvez utiliser sort_values avec groupby et agrégation diff :

df['diff'] = df.sort_values(['id','time']).groupby('id')['time'].diff()
print (df)
  id                time     diff
0  A 2016-11-25 16:32:17      NaT
1  A 2016-11-25 16:36:04 00:00:35
2  A 2016-11-25 16:35:29 00:03:12
3  B 2016-11-25 16:35:24      NaT
4  B 2016-11-25 16:35:46 00:00:22

Si besoin, supprimez les lignes avec NaT dans la colonne diff utilisez dropna :

df = df.dropna(subset=['diff'])
print (df)
  id                time     diff
2  A 2016-11-25 16:35:29 00:03:12
1  A 2016-11-25 16:36:04 00:00:35
4  B 2016-11-25 16:35:46 00:00:22

Vous pouvez également remplacer la colonne:

df.time = df.sort_values(['id','time']).groupby('id')['time'].diff()
print (df)
  id     time
0  A      NaT
1  A 00:00:35
2  A 00:03:12
3  B      NaT
4  B 00:00:22

df.time = df.sort_values(['id','time']).groupby('id')['time'].diff()
df = df.dropna(subset=['time'])
print (df)
  id     time
1  A 00:00:35
2  A 00:03:12
4  B 00:00:22
32
jezrael