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:
- Crear una clase que tenga un método.
skip(self, d)
que regresaTrue
para las fechas que deben omitirse. - 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. - Devolver
True
para cualquier fecha que esté en el diccionario od.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.