Convertir la colonne Pandas en DateTime

242

J'ai un champ dans un pandas DataFrame qui a été importé au format chaîne. Il doit s'agir d'une variable datetime. Comment puis-je le convertir en une colonne datetime, puis filtrer en fonction de la date.

Exemple:

  • Nom du DataFrame : raw_data
  • Nom de la colonne: Mycol
  • Format de valeur dans la colonne: '05SEP2014: 00: 00: 00.000'
Chris
la source

Réponses:

431

Utilisez la to_datetimefonction en spécifiant un format pour correspondre à vos données.

raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')
chrisb
la source
71
Remarque: l' formatargument n'est pas requis. to_datetimeest intelligent. Allez-y et essayez-le sans essayer de faire correspondre vos données.
samthebrand
6
Afin d'éviter l' SettingWithCopyWarningutilisation du @ darth-behfans stackoverflow.com/a/42773096/4487805
Álvaro Loza
3
Et si vous voulez juste du temps et non du rendez-vous?
FaCoffee
5
Pas terriblement intelligent. Même si une partie de la colonne est sans ambiguïté au format dayfirst = True, elle sera toujours par défaut à dayfirst = False pour les autres de la même colonne. Il est donc plus sûr d'utiliser une spécification de format explicite ou au moins le paramètre dayfirst.
CPBL
10
L'omission de la chaîne de formatage peut ralentir cette opération avec de nombreux enregistrements. Cette réponse explique pourquoi. On dirait que cela infer_datetime_format=Truepourrait également augmenter la vitesse d'analyse jusqu'à ~ 5-10x (selon les documents de pandas) si vous n'incluez pas de chaîne de format.
atwalsh
52

Vous pouvez utiliser la méthode DataFrame .apply()pour opérer sur les valeurs dans Mycol:

>>> df = pd.DataFrame(['05SEP2014:00:00:00.000'],columns=['Mycol'])
>>> df
                    Mycol
0  05SEP2014:00:00:00.000
>>> import datetime as dt
>>> df['Mycol'] = df['Mycol'].apply(lambda x: 
                                    dt.datetime.strptime(x,'%d%b%Y:%H:%M:%S.%f'))
>>> df
       Mycol
0 2014-09-05
viande_mecanique
la source
1
Merci! C'est bien car c'est plus largement applicable mais l'autre réponse était plus directe. J'ai eu du mal à décider ce que j'aimais mieux :)
Chris
2
J'aime mieux cette réponse, car elle produit un objet datetime par opposition à un objet
pandas.tslib.Timestamp
25

Si vous avez plusieurs colonnes à convertir, vous pouvez procéder comme suit:

df[["col1", "col2", "col3"]] = df[["col1", "col2", "col3"]].apply(pd.to_datetime)
Vlad Bezden
la source
15
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')

fonctionne, mais il en résulte un avertissement Python d'une valeur tente d'être définie sur une copie d'une tranche à partir d'un DataFrame. Essayez d'utiliser à la .loc[row_indexer,col_indexer] = valueplace

Je suppose que cela est dû à une indexation en chaîne.

Dark BEHFANS
la source
3
Cela m'a pris quelques essais, mais cela fonctionne: raw_data.loc [:, 'Mycol'] = pd.to_datetime (raw_data ['Mycol'], format = '% d% b% Y:% H:% M:% S .% f ')
pinegulf
9

Utilisez la to_datetimefonction pandas pour analyser la colonne comme DateTime. De plus, en utilisant infer_datetime_format=True, il détectera automatiquement le format et convertira la colonne mentionnée en DateTime.

import pandas as pd
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], infer_datetime_format=True)
Prateek Sharma
la source