¿Cómo combinar las columnas de año, mes y día en una sola columna de fecha y hora?

Tengo el siguiente df :

  id lat lon year month day 0 381 53.30660 -0.54649 2004 1 2 1 381 53.30660 -0.54649 2004 1 3 2 381 53.30660 -0.54649 2004 1 4 

y quiero crear una nueva columna df['Date'] donde las columnas de year , month y day se combinen de acuerdo con el formato yyyy-md .

Siguiendo este post , hice:

 `df['Date']=pd.to_datetime(df['year']*10000000000 +df['month']*100000000 +df['day']*1000000, format='%Y-%m-%d%')` 

El resultado no es lo que esperaba, ya que comienza a partir de 1970 en lugar de 2004, y también contiene el sello de hora, que no especifiqué:

  id lat lon year month day Date 0 381 53.30660 -0.54649 2004 1 2 1970-01-01 05:34:00.102 1 381 53.30660 -0.54649 2004 1 3 1970-01-01 05:34:00.103 2 381 53.30660 -0.54649 2004 1 4 1970-01-01 05:34:00.104 

Como las fechas deberían estar en el formato 2004-1-2 , ¿qué estoy haciendo mal?

Hay una manera más fácil:

 In [250]: df['Date']=pd.to_datetime(df[['year','month','day']]) In [251]: df Out[251]: id lat lon year month day Date 0 381 53.3066 -0.54649 2004 1 2 2004-01-02 1 381 53.3066 -0.54649 2004 1 3 2004-01-03 2 381 53.3066 -0.54649 2004 1 4 2004-01-04 

de documentos :

Ensamblando un datetime a partir de múltiples columnas de un DataFrame. Las claves pueden ser abreviaturas comunes como [ year , month , day , minute , second , ms , ns ]) o plurales de la misma

Para arreglar tu código

 df['Date']=pd.to_datetime(df.year*10000+df.month*100+df.day,format='%Y%m%d') df Out[57]: id lat lon year month day Date 0 381 53.3066 -0.54649 2004 1 2 2004-01-02 1 381 53.3066 -0.54649 2004 1 3 2004-01-03 2 381 53.3066 -0.54649 2004 1 4 2004-01-04 

Una solución sería convertir estas columnas en cadenas, concatenar usando agg + str.join , y luego convertirlas a datetime .

 df['Date'] = pd.to_datetime( df[['year', 'month', 'day']].astype(str).agg('-'.join, axis=1)) df id lat lon year month day Date 0 381 53.3066 -0.54649 2004 1 2 2004-01-02 1 381 53.3066 -0.54649 2004 1 3 2004-01-03 2 381 53.3066 -0.54649 2004 1 4 2004-01-04 

También es posible que desee agregar un errors='coerce' argumento de errors='coerce' si tiene combinaciones de fecha y hora no válidas entre sus columnas.