Saltar al contenido

Agregue n días hábiles a una fecha determinada ignorando días festivos y fines de semana en python

Si encuentras algún problema con tu código o trabajo, recuerda probar siempre en un entorno de testing antes aplicar el código al trabajo final.

Solución:

Saltarse los fines de semana sería bastante fácil haciendo algo como esto:

import datetime
def date_by_adding_business_days(from_date, add_days):
    business_days_to_add = add_days
    current_date = from_date
    while business_days_to_add > 0:
        current_date += datetime.timedelta(days=1)
        weekday = current_date.weekday()
        if weekday >= 5: # sunday = 6
            continue
        business_days_to_add -= 1
    return current_date

#demo:
print '10 business days from today:'
print date_by_adding_business_days(datetime.date.today(), 10)

El problema con los días festivos es que varían mucho según el país o incluso según la región, la religión, etc. Necesitaría una lista/conjunto de días festivos para su caso de uso y luego omitirlos de manera similar. Un punto de partida puede ser el feed de calendario que publica Apple para iCal (en formato ics), el de EE. UU. sería http://files.apple.com/calendars/US32Holidays.ics

Podría usar el módulo icalendar para analizar esto.

Si no le importa usar una biblioteca de terceros, dateutil es útil

from dateutil.rrule import *
print "In 4 business days, it's", rrule(DAILY, byweekday=(MO,TU,WE,TH,FR))[4]

También puedes mirar rruleset y usando .exdate() para proporcionar los días festivos para omitirlos en el cálculo, y opcionalmente hay un cache opción para evitar volver a calcular que podría valer la pena considerar.

No hay ningún atajo real para hacer esto. Pruebe este enfoque:

  1. Crear una clase que tenga un método. skip(self, d) que regresa True para las fechas que deben omitirse.
  2. Cree un diccionario en la clase que contenga todos los días festivos como objetos de fecha. no usar datetime o similar porque las fracciones de un día te van a matar.
  3. Devolver True para cualquier fecha que esté en el diccionario o d.weekday() >= 5

Para agregar N días, utilice este método:

def advance(d, days):
    delta = datetime.timedelta(1)

    for x in range(days):
        d = d + delta
        while holidayHelper.skip(d):
            d = d + delta

    return d

Si piensas que ha sido provechoso este post, te agradeceríamos que lo compartas con otros juniors de esta manera nos ayudas a dar difusión a nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *