J'ai un cadre de données Pandas, dont l'une des colonnes contient des chaînes de date au format 'AAAA-MM-JJ', par exemple. "2013-10-28".
Pour le moment, le type de la colonne est 'object'.
Comment convertir les valeurs de colonne en Pandas format de date?
Utilisez astype
In [31]: df
Out[31]:
a time
0 1 2013-01-01
1 2 2013-01-02
2 3 2013-01-03
In [32]: df['time'] = df['time'].astype('datetime64[ns]')
In [33]: df
Out[33]:
a time
0 1 2013-01-01 00:00:00
1 2 2013-01-02 00:00:00
2 3 2013-01-03 00:00:00
Essentiellement équivalent à @waitingkuo, mais j'utiliserais to_datetime
ici (il semble un peu plus propre et offre des fonctionnalités supplémentaires, par exemple dayfirst
):
In [11]: df
Out[11]:
a time
0 1 2013-01-01
1 2 2013-01-02
2 3 2013-01-03
In [12]: pd.to_datetime(df['time'])
Out[12]:
0 2013-01-01 00:00:00
1 2013-01-02 00:00:00
2 2013-01-03 00:00:00
Name: time, dtype: datetime64[ns]
In [13]: df['time'] = pd.to_datetime(df['time'])
In [14]: df
Out[14]:
a time
0 1 2013-01-01 00:00:00
1 2 2013-01-02 00:00:00
2 3 2013-01-03 00:00:00
Gestion ValueError
s
Si vous vous retrouvez dans une situation où
df['time'] = pd.to_datetime(df['time'])
Jette un
ValueError: Unknown string format
Cela signifie que vous avez des valeurs non valides (non coercibles). Si vous êtes d'accord pour les convertir en pd.NaT
, vous pouvez ajouter un argument errors='coerce'
à to_datetime
:
df['time'] = pd.to_datetime(df['time'], errors='coerce')
J'imagine que beaucoup de données entrent dans Pandas à partir de fichiers CSV. Dans ce cas, vous pouvez simplement convertir la date lors de la lecture initiale du fichier CSV:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
où le 0 fait référence à la colonne dans laquelle se trouve la date.
Vous pouvez également ajouter , index_col=0
si vous souhaitez que la date soit votre index.
Voir http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
Maintenant vous pouvez faire df['column'].dt.date
Notez que pour les objets datetime, si vous ne voyez pas l'heure où ils sont tous 00:00:00, ce ne sont pas des pandas. C'est le cahier iPython qui tente de rendre les choses jolies.
Une autre façon de faire ceci et cela fonctionne bien si vous avez plusieurs colonnes à convertir en date/heure.
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
Il se peut que les dates doivent être converties à une fréquence différente. Dans ce cas, je suggérerais de définir un index par dates.
#set an index by dates
df.set_index(['time'], drop=True, inplace=True)
Après cela, vous pourrez plus facilement convertir le type de format de date dont vous aurez le plus besoin. Ci-dessous, je convertis séquentiellement en un certain nombre de formats de date, pour finalement aboutir à un ensemble de dates quotidiennes au début du mois.
#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)
#Convert to monthly dates
df.index = df.index.to_period(freq='M')
#Convert to strings
df.index = df.index.strftime('%Y-%m')
#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)
Par souci de concision, je ne montre pas que je lance le code suivant après chaque ligne ci-dessus:
print(df.index)
print(df.index.dtype)
print(type(df.index))
Cela me donne la sortie suivante:
Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>
Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>
DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>