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 – Contador de días para vacaciones y días transcurridos en df

Soy nuevo en la programación.

Quiero crear 4 columnas en un dataframe existente de vacaciones en Francia:

  • “Cuenta atrás” en días hasta el primer día de las próximas vacaciones.
  • “Nombre de las próximas vacaciones” relacionado con la cuenta atrás.
  • “Cuenta regresiva” en días desde el último día de las vacaciones pasadas más tempranas.
  • “Nombre de las vacaciones pasadas” relacionado con la cuenta regresiva.

El dataframe existente incluye:

  • “fecha” (objeto).
  • “vacanceszonaA” (bool) Verdadero o Falso si en la zona A (Francia se divide en 3 zonas para las vacaciones) en esta fecha hay vacaciones.
  • “vacanceszonaB” (bool) Verdadero o Falso si en la zona B (Francia se divide en 3 zonas para las vacaciones) en esta fecha hay vacaciones.
  • “vacanceszonaC” (bool) Verdadero o Falso si en la zona C (Francia se divide en 3 zonas para las vacaciones) en esta fecha hay vacaciones.
  • “nom_vacances” (objeto) Nombre de las vacaciones si es Verdadero, vacío si es Falso.

Mi objetivo es añadir esas 4 columnas por zona para contar cuántos días faltan para las próximas vacaciones y cuántos días han pasado desde las vacaciones pasadas para la zona.

He extraído una lista de fechas para cada zona donde vacanceszonaXX era Verdadero.

Ejemplo a duplicar para cada zona:
Necesito crear una columna “Cuenta atrás zona A” que encuentre la fecha más cercana en la lista.
En la columna “Nombre de las próximas vacaciones” el nombre de las vacaciones relacionadas con la cuenta atrás.
En la columna “Cuenta regresiva zona A” que encuentre la fecha pasada más cercana en la lista.
En la columna “Nombre de las vacaciones pasadas” el nombre de las vacaciones relacionadas con la cuenta regresiva.

Pensé que crear una lista para cada zona sería la forma más fácil de obtener la información que necesito, pero estoy abierto a la forma más sencilla de resolver el problema.

Este enlace y este otro no incluyen la información en un dataframe.

Intenté esto pero no funciona…

df['Cuenta atrás zona A'] = date_list_a.index[date_list_a.index.get_loc(df, method='nearest')]

TypeError: ‘>’ not supported between instances of ‘int’ and ‘tuple’

¡Gracias de antemano por tu ayuda!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Estimado/a nuevo/a programador/a,

    Crear las cuatro columnas que mencionaste se puede lograr utilizando Python y sus bibliotecas, especialmente pandas y datetime. Aquí te muestro una manera de hacerlo:

    1. Primero, importa las bibliotecas necesarias:
    import pandas as pd
    from datetime import datetime, timedelta
    import holidays
    
    1. Luego, lee tu DataFrame existente:
    df = pd.read_csv('existing_df.csv')
    
    1. A continuación, crea un diccionario de días festivos en Francia utilizando la biblioteca holidays:
    fr_holidays = holidays.FRA(years=df['date'].dt.year.unique())
    
    1. Después, crea una lista de fechas para cada zona donde vacances_zone_xx sea True:
    date_list_a = df.date[(df['vacances_zone_a'] == True)]
    date_list_b = df.date[(df['vacances_zone_b'] == True)]
    date_list_c = df.date[(df['vacances_zone_c'] == True)]
    
    1. Ahora, crea una función que reciba una lista de fechas y una bandera booleana como entrada, y devuelva la cuenta regresiva o ascendente y el nombre del día festivo correspondiente:
    def obtener_cuenta_nombre(lista_fechas, es_cuenta_regresiva):
        hoy = datetime.now().date()
        if es_cuenta_regresiva:
            proxima_fecha = lista_fechas[lista_fechas > hoy].min()
            cuenta_regresiva = (proxima_fecha - hoy).days
            nombre = fr_holidays[proxima_fecha]
        else:
            fecha_pasada = lista_fechas[lista_fechas <= hoy].max()
            cuenta_ascendente = (hoy - fecha_pasada).days
            nombre = fr_holidays[fecha_pasada]
        return cuenta_regresiva or cuenta_ascendente, nombre
    
    1. Por último, aplica esta función a tu DataFrame, zona por zona, para crear las cuatro columnas:
    df['Cuenta_regresiva_zona_a'], df['Nombre_del_siguiente_día_festivo_zona_a'] = \
        zip(*df['vacances_zone_a'].apply(lambda x: obtener_cuenta_nombre(date_list_a, True) if x else (None, '')))
    
    df['Cuenta_ascendente_zona_a'], df['Nombre_del_día_festivo_previo_zona_a'] = \
        zip(*df['vacances_zone_a'].apply(lambda x: obtener_cuenta_nombre(date_list_a, False) if x else (None, '')))
    
    # Repite para las otras dos zonas
    

    Ten en cuenta que la función zip() se utiliza para separar los resultados de la función apply() en dos columnas separadas.

    Espero que esto te ayude a alcanzar tu objetivo. No dudes en contactarme si tienes alguna pregunta. ¡Buena suerte en tu viaje de programación!

    Saludos cordiales,

    Un experto en IT especializado en Python, pandas y datetime.

Comments are closed.