Respuestas:
Usar un tipo
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']]
Esencialmente equivalente a @waitingkuo, pero lo usaría to_datetime
aquí (parece un poco más limpio y ofrece alguna funcionalidad adicional, por ejemplo 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
Manejo ValueError
s
Si se encuentra en una situación en la que
df['time'] = pd.to_datetime(df['time'])
Lanza un
ValueError: Unknown string format
Eso significa que tiene valores inválidos (no coercibles). Si está de acuerdo con convertirlos a pd.NaT
, puede agregar un errors='coerce'
argumento a to_datetime
:
df['time'] = pd.to_datetime(df['time'], errors='coerce')
Me imagino que muchos datos ingresan a Pandas desde archivos CSV, en cuyo caso simplemente puede convertir la fecha durante la lectura CSV inicial:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
donde el 0 se refiere a la columna en la que está la fecha.
También puede agregar , index_col=0
allí si desea que la fecha sea su índice.
Ver https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
Ahora puedes hacer df['column'].dt.date
Tenga en cuenta que para los objetos de fecha y hora, si no ve la hora en la que todos son 00:00:00, eso no es pandas. Ese es el portátil iPython que intenta que las cosas se vean bonitas.
df[col] = pd.to_datetime(df[col])
primero para convertir su columna en objetos de fecha y hora.
dtype = object
que ocupa considerablemente más memoria que una verdadera datetime dtype
en pandas.
Otra forma de hacer esto y esto funciona bien si tiene varias columnas para convertir a fecha y hora.
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
date
solo tenga valores en sus columnas, la conversión a fecha y hora solo retendrá la información pertinente. Si convierte explícitamente el uso df['datetime_col'].dt.date
, resultará en un object
dtype; Pérdida en la gestión de la memoria.
Si desea obtener el formato DATE y no DATETIME:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
Puede darse el caso de que las fechas deban convertirse a una frecuencia diferente. En este caso, sugeriría establecer un índice por fechas.
#set an index by dates
df.set_index(['time'], drop=True, inplace=True)
Después de esto, puede convertir más fácilmente al tipo de formato de fecha que más necesite. A continuación, convierto secuencialmente a varios formatos de fecha, y finalmente termino con un conjunto de fechas diarias al comienzo del mes.
#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)
Por brevedad, no muestro que ejecuto el siguiente código después de cada línea anterior:
print(df.index)
print(df.index.dtype)
print(type(df.index))
Esto me da el siguiente resultado:
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'>
Intente convertir una de las filas en una marca de tiempo usando la función pd.to_datetime y luego use .map para asignar el formulario a toda la columna
# 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]