web-dev-qa-db-fra.com

Comment convertir des dates dans un bloc de données Pandas en un type de données "date"?

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?

76
user7289

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
79
waitingkuo

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 ValueErrors
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')
92
Andy Hayden

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

25
fantabolous

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.

18
szeitlin

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)
0
SSS

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'>
0
Ted M.