Risposte:
Usa 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
df['time'] = [time.date() for time in df['time']]
Essenzialmente equivalente a @waitingkuo, ma lo userei to_datetime
qui (sembra un po 'più pulito e offre alcune funzionalità aggiuntive, ad esempio 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
Gestione ValueError
s
Se ti imbatti in una situazione in cui stai facendo
df['time'] = pd.to_datetime(df['time'])
Lancia un
ValueError: Unknown string format
Ciò significa che hai valori non validi (non coercibili). Se ti va di convertirli in pd.NaT
, puoi aggiungere un errors='coerce'
argomento a to_datetime
:
df['time'] = pd.to_datetime(df['time'], errors='coerce')
Immagino che molti dati entrino in Panda da file CSV, nel qual caso puoi semplicemente convertire la data durante la lettura CSV iniziale:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
dove lo 0 si riferisce alla colonna in cui si trova la data.
Puoi anche aggiungere , index_col=0
lì se vuoi che la data sia il tuo indice.
Vedi https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
Adesso puoi farlo df['column'].dt.date
Nota che per gli oggetti datetime, se non vedi l'ora in cui sono tutti 00:00:00, non è panda. Questo è il notebook iPython che cerca di far sembrare le cose belle.
df[col] = pd.to_datetime(df[col])
prima convertire la colonna in oggetti di data e ora.
dtype = object
cui occupa molta più memoria rispetto a un vero datetime dtype
in Panda.
Un altro modo per farlo e funziona bene se hai più colonne da convertire in datetime.
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
date
solo valori nelle colonne, la conversione a datetime manterrà solo le informazioni pertinenti. Se si converte esplicitamente usando, si df['datetime_col'].dt.date
otterrà un object
dtype; perdita nella gestione della memoria.
Se vuoi ottenere il formato DATE e non DATETIME:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
Potrebbe essere necessario convertire le date in una frequenza diversa. In questo caso, suggerirei di impostare un indice per date.
#set an index by dates
df.set_index(['time'], drop=True, inplace=True)
Dopo questo, puoi convertire più facilmente nel tipo di formato della data di cui avrai più bisogno. Di seguito, converto in sequenza in un numero di formati di data, finendo infine con una serie di date giornaliere all'inizio del mese.
#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)
Per brevità, non mostro di eseguire il seguente codice dopo ogni riga sopra:
print(df.index)
print(df.index.dtype)
print(type(df.index))
Questo mi dà il seguente output:
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'>
Prova a convertire una delle righe in timestamp usando la funzione pd.to_datetime e poi usa .map per mappare il formular all'intera colonna
# 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]