Convierta el tipo de columna DataFrame de cadena a fecha y hora, formato dd / mm / aaaa

Respuestas:

476

La forma más fácil es usar to_datetime:

df['col'] = pd.to_datetime(df['col'])

También ofrece un dayfirstargumento para los tiempos europeos (pero cuidado, esto no es estricto ).

Aquí está en acción:

In [11]: pd.to_datetime(pd.Series(['05/23/2005']))
Out[11]:
0   2005-05-23 00:00:00
dtype: datetime64[ns]

Puedes pasar un formato específico :

In [12]: pd.to_datetime(pd.Series(['05/23/2005']), format="%m/%d/%Y")
Out[12]:
0   2005-05-23
dtype: datetime64[ns]
Andy Hayden
fuente
gracias por tu repetición, ¿puedo definir su formato? como '% d /% m /% Y'? muy apreciado
perigeo
2
@shootingstars quizás vea stackoverflow.com/questions/13703720/…
Andy Hayden
1
@shootingstars que pasa la matriz DatetimeIndex(df['col']).to_pydatetime()debería funcionar.
Andy Hayden
1
Nvm, comenté demasiado temprano. La búsqueda SettingWithCopyWarningda suficiente material
Sundeep
2
@daneshjai doble-llaves hace un DataFrame (con solo una columna) en comparación con llaves simples que obtiene la columna como una Serie.
Andy Hayden
36

Si su columna de fecha es una cadena con el formato '2017-01-01', puede usar pandas astype para convertirla en datetime.

df['date'] = df['date'].astype('datetime64[ns]')

o use datetime64 [D] si desea precisión de día y no nanosegundos

print(type(df_launath['date'].iloc[0]))

rendimientos

<class 'pandas._libs.tslib.Timestamp'> lo mismo que cuando usas pandas.to_datetime

Puede probarlo con otros formatos y luego '% Y-% m-% d' pero al menos esto funciona.

sigurdb
fuente
2

Si tiene una combinación de formatos en su fecha, no se olvide de configurar infer_datetime_format=Truepara facilitar la vida

df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)

Fuente: pd.to_datetime

o si quieres un enfoque personalizado:

def autoconvert_datetime(value):
    formats = ['%m/%d/%Y', '%m-%d-%y']  # formats to try
    result_format = '%d-%m-%Y'  # output format
    for dt_format in formats:
        try:
            dt_obj = datetime.strptime(value, dt_format)
            return dt_obj.strftime(result_format)
        except Exception as e:  # throws exception when format doesn't match
            pass
    return value  # let it be if it doesn't match

df['date'] = df['date'].apply(autoconvert_datetime)
abhyudayasrinet
fuente