178 votes

Combiner les colonnes de date et d'heure en utilisant python pandas

J'ai un dataframe pandas avec les colonnes suivantes :

data = {'Date': ['01-06-2013', '02-06-2013', '02-06-2013', '02-06-2013', '02-06-2013', '03-06-2013', '03-06-2013', '03-06-2013', '03-06-2013', '04-06-2013'],
        'Time': ['23:00:00', '01:00:00', '21:00:00', '22:00:00', '23:00:00', '01:00:00', '21:00:00', '22:00:00', '23:00:00', '01:00:00']}
df = pd.DataFrame(data)

         Date      Time
0  01-06-2013  23:00:00
1  02-06-2013  01:00:00
2  02-06-2013  21:00:00
3  02-06-2013  22:00:00
4  02-06-2013  23:00:00
5  03-06-2013  01:00:00
6  03-06-2013  21:00:00
7  03-06-2013  22:00:00
8  03-06-2013  23:00:00
9  04-06-2013  01:00:00

Comment puis-je combiner data['Date'] & data['Time'] pour obtenir ce qui suit ? Y a-t-il un moyen de le faire en utilisant pd.to_datetime ?

Date
01-06-2013 23:00:00
02-06-2013 01:00:00
02-06-2013 21:00:00
02-06-2013 22:00:00
02-06-2013 23:00:00
03-06-2013 01:00:00
03-06-2013 21:00:00
03-06-2013 22:00:00
03-06-2013 23:00:00
04-06-2013 01:00:00

259voto

Andy Hayden Points 38010

Il est utile de mentionner que vous avez peut-être pu lire ceci en directement Par exemple, si vous utilisez read_csv en utilisant parse_dates=[['Date', 'Time']] .

En supposant qu'il ne s'agit que de chaînes de caractères, vous pourriez simplement les additionner (avec un espace), ce qui vous permettrait d'utiliser les éléments suivants to_datetime qui fonctionne sans spécifier l'option format= paramètre

In [11]: df['Date'] + ' ' + df['Time']
Out[11]:
0    01-06-2013 23:00:00
1    02-06-2013 01:00:00
2    02-06-2013 21:00:00
3    02-06-2013 22:00:00
4    02-06-2013 23:00:00
5    03-06-2013 01:00:00
6    03-06-2013 21:00:00
7    03-06-2013 22:00:00
8    03-06-2013 23:00:00
9    04-06-2013 01:00:00
dtype: object

In [12]: pd.to_datetime(df['Date'] + ' ' + df['Time'])
Out[12]:
0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00
dtype: datetime64[ns]

Alternativement, sans le + ' ' mais le format= doit être utilisé. De plus, pandas est capable de déduire le format à convertir dans un fichier de type datetime Cependant, il est plus rapide de spécifier le format exact.

pd.to_datetime(df['Date'] + df['Time'], format='%m-%d-%Y%H:%M:%S')

Note : de manière surprenante (pour moi), cela fonctionne bien avec les NaNs convertis en NaT, mais il faut s'inquiéter du fait que la conversion (peut-être en utilisant l'attribut raise argument).

%%timeit

# sample dataframe with 10000000 rows using df from the OP
df = pd.concat([df for _ in range(1000000)]).reset_index(drop=True)

%%timeit
pd.to_datetime(df['Date'] + ' ' + df['Time'])
[result]:
1.73 s ± 10.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
pd.to_datetime(df['Date'] + df['Time'], format='%m-%d-%Y%H:%M:%S')
[result]:
1.33 s ± 9.88 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

57voto

jka.ne Points 604

La réponse acceptée fonctionne pour les colonnes qui sont de type de données string . Pour être complet : Je suis tombé sur cette question en cherchant comment faire lorsque les colonnes sont de type date et heure.

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)

33voto

Chris PERE Points 142

Cast les colonnes si les types sont différents ( datetime et timestamp o str ) et utiliser to_datetime :

df.loc[:,'Date'] = pd.to_datetime(df.Date.astype(str)+' '+df.Time.astype(str))

Résultat :

0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00

Le meilleur,

22voto

M.K Rana Points 183

Vous pouvez l'utiliser pour fusionner la date et l'heure dans la même colonne du cadre de données.

import pandas as pd    
data_file = 'data.csv' #path of your file

Lecture du fichier .csv avec des colonnes fusionnées Date_Heure :

data = pd.read_csv(data_file, parse_dates=[['Date', 'Time']]) 

Vous pouvez utiliser cette ligne pour conserver les deux autres colonnes également.

data.set_index(['Date', 'Time'], drop=False)

12voto

jabellcu Points 321

Je n'ai pas assez de réputation pour faire des commentaires. jka.ne donc :

J'ai dû modifier La ligne de jka.ne pour qu'il fonctionne :

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']).time(),1)

Cela pourrait aider d'autres personnes.

De plus, j'ai testé une approche différente, en utilisant replace au lieu de combine :

def combine_date_time(df, datecol, timecol):
    return df.apply(lambda row: row[datecol].replace(
                                hour=row[timecol].hour,
                                minute=row[timecol].minute),
                    axis=1)

ce qui, dans le cas de l'OP, serait :

combine_date_time(df, 'Date', 'Time')

J'ai chronométré les deux approches pour un ensemble de données relativement important (>500 000 lignes), et elles ont toutes deux des temps d'exécution similaires, mais en utilisant combine est plus rapide (59s pour replace contre 50s pour combine ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X