J'ai une colonne de durée mais les valeurs sont différentes. Certaines durées ne sont que des formats d'heure et d'autres se sont mélangées à la date. Je veux la colonne de durée en secondes totales. J'ai essayé de convertir la colonne avec les méthodes to_datetime et parse_date mais cela ne peut pas fonctionner. Comment faire cela chez les pandas? Voici la colonne:

enter image description here

entrez la description de l'image ici

-1
MAK 17 avril 2018 à 14:05

3 réponses

Meilleure réponse

Utilisation de regex:

import pandas as pd
df = pd.DataFrame({"a": ["03:59:49", "04:59:49", "1904-01-01 05:59:49", "1904-01-01 06:59:49"]})
df["TotalSeconds"]  = pd.to_timedelta(df["a"].str.extract('(\d{2}:\d{2}:\d{2})')).dt.total_seconds()
print(df)

Sortie:

                     a  TotalSeconds
0             03:59:49       14389.0
1             04:59:49       17989.0
2  1904-01-01 05:59:49       21589.0
3  1904-01-01 06:59:49       25189.0
0
Rakesh 17 avril 2018 à 11:25

Filtrez les 8 dernières valeurs, convertissez to_timedelta puis utilisez total_seconds:

df = pd.DataFrame({'col':['03:59:49', '1904-01-01 04:06:08']})

df['new'] = pd.to_timedelta(df['col'].str[-8:]).dt.total_seconds().astype(int)
print (df)
                   col    new
0             03:59:49  14389
1  1904-01-01 04:06:08  14768

ÉDITER:

df['new'] = pd.to_timedelta(pd.to_datetime(df['col']).dt.strftime('%H:%M:%S')).dt.total_seconds().astype(int)
0
jezrael 17 avril 2018 à 11:46

Une façon consiste à utiliser pd.Series.apply avec une clause try / except, qui tente chaque méthode séquentiellement.

L'avantage de cette méthode est qu'elle accepte une large gamme d'entrées potentielles pour timedelta et datetime.

import pandas as pd, numpy as np

df = pd.DataFrame({'Mixed': ['03:59:49', '1904-01-01 04:06:08']})

def return_seconds(x):
    try:
        return pd.to_timedelta(x).total_seconds()
    except:
        try:
            dt = pd.to_datetime(x)
            return (dt - dt.normalize()).total_seconds()
        except:
            return np.nan

df['TotalSeconds'] = df['Mixed'].apply(return_seconds).astype(int)

print(df)

#                  Mixed  TotalSeconds
# 0             03:59:49         14389
# 1  1904-01-01 04:06:08         14768
0
jpp 17 avril 2018 à 11:44