pandas: extraer fecha y hora de la marca de tiempo

Tengo una columna de timestamp donde la marca de tiempo está en el siguiente formato

 2016-06-16T21:35:17.098+01:00 

Quiero extraer la fecha y la hora de ella. He hecho lo siguiente:

 import datetime as dt df['timestamp'] = df['timestamp'].apply(lambda x : pd.to_datetime(str(x))) df['dates'] = df['timestamp'].dt.date 

Esto funcionó por un tiempo. Pero de repente no lo hace.

Si vuelvo a hacer df['dates'] = df['timestamp'].dt.date me df['dates'] = df['timestamp'].dt.date el siguiente error

 Can only use .dt accessor with datetimelike values 

Afortunadamente, he guardado el dataframe con dates en el CSV pero ahora quiero crear otra columna de time en el formato 23:00:00.051

EDITAR

Del archivo de datos sin procesar (15 millones de muestras), la columna de timestamp ve como la siguiente (primeras 5 muestras):

  timestamp 0 2016-06-13T00:00:00.051+01:00 1 2016-06-13T00:00:00.718+01:00 2 2016-06-13T00:00:00.985+01:00 3 2016-06-13T00:00:02.431+01:00 4 2016-06-13T00:00:02.737+01:00 

Después del siguiente comando

 df['timestamp'] = df['timestamp'].apply(lambda x : pd.to_datetime(str(x))) 

la columna de timestamp parece con dtype como dtype: datetime64 [ns]

 0 2016-06-12 23:00:00.051 1 2016-06-12 23:00:00.718 2 2016-06-12 23:00:00.985 3 2016-06-12 23:00:02.431 4 2016-06-12 23:00:02.737 

Entonces finalmente

 df['dates'] = df['timestamp'].dt.date 0 2016-06-12 1 2016-06-12 2 2016-06-12 3 2016-06-12 4 2016-06-12 

Editar 2

Encontré el error. Limpié los datos y guardé el dataframe en un archivo csv, por lo que no tengo que volver a limpiarlos. Cuando leo el csv, el dtype marca de dtype cambia al objeto. Ahora, ¿cómo puedo solucionar esto?

importar fecha y hora

Si la fecha es en forma de cadena entonces

 df['DateTime'] = [datetime.datetime.strptime(d, "%Y-%m-%d %H:%M") for d in df["DateTime"]]# this line converts the string object in Timestamp object df['Date'] = [datetime.datetime.date(d) for d in df['DateTime']]# extracting date from timestamp df['Time'] = [datetime.datetime.time(d) for d in df['DateTime']]# extracting time from timestamp 

Si el objeto ya está en el formato de marca de tiempo, omita la primera línea de código.

“% Y-% m-% d% H:% M” significa que su objeto de marca de tiempo debe tener la forma “2016-05-16 12:35:00”.

Haz esto primero

 df['time'] = pd.to_datetime(df['timestamp']) 

Antes de hacer su extracción como de costumbre:

 df['dates'] = df['time'].dt.date