es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Combinar las columnas de mes y año para crear una columna de fecha.

Tengo un dataframe de pyspark:

Ubicación Mes Año
USA 1 2020
USA 1 2021
CAN 1 2020
CAN 2 2020
CAN 1 2021
CAN 2 2021

Necesito combinar las columnas Mes y Año para crear la columna Fecha.
Mi dataframe esperado debería ser:

Ubicación Mes Año Fecha
USA 1 2020 1/1/2020
USA 1 2021 1/1/2021
CAN 1 2020 1/1/2020
CAN 2 2020 2/1/2020
CAN 1 2021 1/1/2021
CAN 2 2021 2/1/2021

Todas las fechas deben comenzar el 1 de cada mes.
He probado este código:

df = df.select(concat_ws('/',df.month,1,df.year).alias('Month') \
,df["*"])

y obtengo este error:

Argumento inválido, no es una cadena o columna

Ambas columnas Mes y Año son de tipo long

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado es el uso del carácter especial ‘&’. La forma correcta de concatenar cadenas en PySpark es utilizando la función ‘concat’.

    Para solucionar el problema de crear la columna Date, podemos utilizar la función ‘concat’ para combinar Month, “/”, 1, “/”, y Year en una sola cadena. Luego, podemos convertir esta cadena en un DateType utilizando la función ‘to_date’.

    El código corregido para crear la columna Date es el siguiente:

    from pyspark.sql.functions import concat, lit, to_date
    
    df = df.withColumn("Date", to_date(concat(df.Month, lit("/"), lit("1"), lit("/"), df.Year), "M/d/yyyy"))
    

    Aquí, utilizamos la función ‘withColumn’ para agregar una nueva columna llamada ‘Date’ al dataframe.

    Dentro de ‘withColumn’, primero utilizamos ‘concat’ para combinar Month, “/”, 1, “/”, y Year en una sola cadena. Utilizamos ‘lit’ para representar el valor literal 1 como una columna.

    Luego utilizamos ‘to_date’ para convertir la cadena concatenada en un DateType. El segundo argumento de ‘to_date’ indica el formato de la cadena de fecha.

    El dataframe resultante es el siguiente:

    +--------+-----+----+----------+
    |Location|Month|Year|      Date|
    +--------+-----+----+----------+
    |     USA|    1|2020|2020-01-01|
    |     USA|    1|2021|2021-01-01|
    |     CAN|    1|2020|2020-01-01|
    |     CAN|    2|2020|2020-02-01|
    |     CAN|    1|2021|2021-01-01|
    |     CAN|    2|2021|2021-02-01|
    +--------+-----+----+----------+
    

Comments are closed.