Réponses:
Utiliser un type
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
df['time'] = [time.date() for time in df['time']]
Essentiellement équivalent à @waitingkuo, mais j'utiliserais to_datetime
ici (cela 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
Manipulation ValueError
s
Si vous vous trouvez dans une situation où
df['time'] = pd.to_datetime(df['time'])
Lance un
ValueError: Unknown string format
Cela signifie que vous avez des valeurs invalides (non coercibles). Si vous êtes d'accord pour les convertir en pd.NaT
, vous pouvez ajouter un errors='coerce'
argument à to_datetime
:
df['time'] = pd.to_datetime(df['time'], errors='coerce')
J'imagine que beaucoup de données arrivent dans Pandas à partir de fichiers CSV, auquel cas vous pouvez simplement convertir la date lors de la lecture initiale du 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 y ajouter , index_col=0
si vous voulez que la date soit votre index.
Voir https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
Maintenant tu peux faire df['column'].dt.date
Notez que pour les objets datetime, si vous ne voyez pas l'heure à laquelle ils sont tous 00:00:00, ce ne sont pas des pandas. C'est un cahier iPython qui essaie de rendre les choses jolies.
df[col] = pd.to_datetime(df[col])
abord convertir votre colonne en objets de date et d'heure.
dtype = object
laquelle prend beaucoup plus de mémoire qu'un vrai datetime dtype
chez les pandas.
Une autre façon de faire ceci et cela fonctionne bien si vous avez plusieurs colonnes à convertir en datetime.
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
date
que des valeurs dans vos colonnes, la conversion en datetime conservera uniquement les informations pertinentes . Si vous convertissez explicitement en utilisant df['datetime_col'].dt.date
cela se traduira par un object
dtype; perte de gestion de la mémoire.
Si vous souhaitez obtenir le format DATE et non DATETIME:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
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 pouvez 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 j'exécute 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'>
Essayez de convertir l'une des lignes en horodatage à l'aide de la fonction pd.to_datetime, puis utilisez .map pour mapper le formulaire à la colonne entière
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null object
1 endDay 110526 non-null object
import pandas as pd
df['startDay'] = pd.to_datetime(df.startDay)
df['endDay'] = pd.to_datetime(df.endDay)
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null datetime64[ns]
1 endDay 110526 non-null datetime64[ns]
Par souci d'exhaustivité, une autre option, qui n'est peut-être pas la plus simple, un peu similaire à celle proposée par @SSS, mais en utilisant plutôt la bibliothèque datetime est:
import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())