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.

Python: ¿Cómo calcular el inicio y fin de la semana a partir de datos diarios en un dataframe de pandas?

Tengo un conjunto de datos diarios para diferentes meses.
Quiero calcular el inicio de la semana (domingo) y el final de la semana (sábado) según cada tipo de producto y país, y los valores deben ser el promedio para esa semana en particular.

“`
fechas producto país valor nombre

2021-10-01 00:00:00 Voz Lucia 2 A
2021-10-01 00:00:00 TV Jamai 1 A
2021-10-01 00:00:00 TV Trin 5 A
2021-10-01 00:00:00 Voz Gren 5 A
2021-10-01 00:00:00 Banda ancha Vin 7 A
2021-10-01 00:00:00 TV Gren 8 A
2021-10-01 00:00:00 Banda ancha Barb 5 A
2021-10-01 00:00:00 Voz Jamai 23 A
2021-10-01 00:00:00 Voz Trin 6 A
2021-10-01 00:00:00 TV Cur 7 A
2021-10-02 00:00:00 Banda ancha Jamai 2 A
2021-10-03 00:00:00 Banda ancha Trin 8 A
2021-10-04 00:00:00 Banda ancha Lucia 3 A
2021-10-04 00:00:00 TV Anti 1 A
2021-10-04 00:00:00 Banda ancha Cur 8 A
2021-10-04 00:00:00 Voz Barb 0 A
2021-10-04 00:00:00 TV Vin 5 A
2021-10-04 00:00:00 Voz Vin 1 A
2021-10-05 00:00:00 NAN NAN NAN NAN
2021-10-06 00:00:00 NAN NAN NAN NAN
2021-10-07 00:00:00 NAN NAN NAN NAN
2021-10-08 00:00:00 NAN NAN NAN NAN
2021-10-09 00:00:00 NAN NAN NAN NAN
2021-10-10 00:00:00 NAN NAN NAN NAN
2021-10-11 00:00:00 NAN NAN NAN NAN
2021-10-12 00:00:00 NAN NAN NAN NAN
2021-10-13 00:00:00 NAN NAN NAN NAN
2021-10-14 00:00:00 NAN NAN NAN NAN
2021-10-15 00:00:00 NAN NAN NAN NAN
……………
…………………………etc

FORMATO de resultado de muestra:

iniciodesemana findesemana producto país nombre valor(promedio de valores para cada semana)

He intentado con groupby, pero no puedo obtener el inicio y fin de la semana para cada producto y país.

También los valores deben ser el promedio (adición) para esa semana en particular.
¿Alguna ayuda sobre cómo lograr esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para calcular el comienzo y fin de la semana de cada producto y país, y obtener el promedio de valores para cada semana, puedes seguir estos pasos:

    1. Convertir la columna “dates” al formato de fecha y hora de pandas utilizando la función pd.to_datetime().
    2. Crear una nueva columna “week_start” para representar el comienzo de la semana (domingo) utilizando la función pandas datetime.weekday().
    3. Crear otra nueva columna “week_end” para representar el fin de la semana (sábado) añadiendo 6 días a la columna “week_start”.
    4. Utilizar la función groupby() de pandas con las columnas “product”, “country”, “week_start” y “week_end” para agrupar los datos y calcular el promedio de la columna “value” para cada grupo.

    Aquí tienes el código para lograr esto:

    import pandas as pd
    
    # cargar los datos en un dataframe de pandas
    data = pd.read_csv("data.csv")
    
    # convertir la columna "dates" al formato de fecha y hora de pandas
    data["dates"] = pd.to_datetime(data["dates"])
    
    # crear una nueva columna "week_start" para representar el comienzo de la semana (domingo)
    data["week_start"] = data["dates"].apply(lambda x: x - pd.Timedelta(days=x.weekday()))
    
    # crear una nueva columna "week_end" para representar el fin de la semana (sábado)
    data["week_end"] = data["week_start"] + pd.Timedelta(days=6)
    
    # agrupar los datos por las columnas "product", "country", "week_start" y "week_end"
    # y calcular el promedio de la columna "value" para cada grupo
    result = data.groupby(["product", "country", "week_start", "week_end"]).agg({"value":"mean", "name":"first"}).reset_index()
    
    # renombrar las columnas
    result = result.rename(columns={"value":"average_value"})
    
    # reordenar las columnas
    result = result[["week_start", "week_end", "product", "country", "name", "average_value"]]
    
    # mostrar el resultado
    print(result)
    

    Este código debería darte la salida deseada con el comienzo y fin de la semana, el producto, el país, el nombre y el valor promedio para cada semana.

Comments are closed.