Supposons que j'ai la trame de données pandas suivante

df = pd.DataFrame ({'time': ['2014-05-01 18:47:05', '2014-05-01 18:47:06', '2014-05-02 18:47:08', '2014-05-02 18:47:10', '2014-05-02 18:47:11']})
df['time'] = pd.to_datetime(df['time'])

Cela donne le cadre de données suivant

              time
0 2014-05-01 18:47:05
1 2014-05-01 18:47:06
2 2014-05-02 18:47:08
3 2014-05-02 18:47:10
4 2014-05-02 18:47:11

Je voudrais ajouter une autre colonne qui calcule la durée de la colonne de temps en secondes comme suit

    time                   duration
0 2014-05-01 18:47:05          0
1 2014-05-01 18:47:06          1 
2 2014-05-02 18:47:08          3 
3 2014-05-02 18:47:10          5
4 2014-05-02 18:47:11          6

Évidemment, je peux faire une boucle et faire une différence manuellement, mais je soupçonne que ce n'est pas un moyen pythonique. Y a-t-il une fonction dans les pandas qui simplifierait ce processus?

3
Liam deBoeuf 16 avril 2018 à 11:57

3 réponses

Meilleure réponse

Cela vous donnera la différence totale en secondes (c'est-à-dire en comptant également les différences de dates):

df['duration'] = pd.to_timedelta(
                     df['time'] - df['time'][0]
                   ).astype('timedelta64[s]')
3
Pinimo 16 avril 2018 à 10:10

Vous pouvez annuler la première entrée de votre série et convertir en secondes:

df['duration'] = (df['time'] - df['time'].iloc[0]).dt.seconds

print(df)

#                  time  duration
# 0 2014-05-01 18:47:05         0
# 1 2014-05-01 18:47:06         1
# 2 2014-05-02 18:47:08         3
# 3 2014-05-02 18:47:10         5
# 4 2014-05-02 18:47:11         6
1
jpp 16 avril 2018 à 09:13

Utilisation:

df['duration'] = (pd.to_datetime(df['time'].dt.strftime('%H:%M:%S'))
                    .diff()
                    .fillna(0)
                    .dt.total_seconds()
                    .astype(int)
                    .cumsum()
                 )

Solution alternative:

a = pd.to_datetime(df['time'].dt.strftime('%H:%M:%S'))
df['duration'] = a.sub(a.iloc[0]).dt.total_seconds().astype(int)

print (df)
                 time  duration
0 2014-05-01 18:47:05         0
1 2014-05-01 18:47:06         1
2 2014-05-02 18:47:08         3
3 2014-05-02 18:47:10         5
4 2014-05-02 18:47:11         6

Explication:

  1. Convertissez d'abord les valeurs to_datetime avec les mêmes Rendez-vous
  2. Faites la différence en diff avec cumsum ou soustrayez première valeur par sub
  3. Dernière conversion en seconds par { {X1}}
2
jezrael 16 avril 2018 à 09:21