Adicionar días hábiles en python
1 sep
Una función para sumar o restar días hábiles en Python:
from datetime import date, timedelta
(MON, TUE, WED, THU, FRI, SAT, SUN) = range(7)
def addworkdays(start, days, holidays=(), workdays=(MON,TUE,WED,THU,FRI)):
weeks, days = divmod(days, len(workdays))
result = start + timedelta(weeks=weeks)
lo, hi = min(start, result), max(start, result)
count = len([h for h in holidays if h >= lo and h <= hi])
days += count * (-1 if days < 0 else 1)
for _ in range(days):
result += timedelta(days=1)
while result in holidays or result.weekday() not in workdays:
result += timedelta(days=1)
return result
Ejemplos:
today = date.today() print 'hoy:', today # 2010-09-01 print addworkdays(today, 1) # 2010-09-02 print addworkdays(today, 3) # 2010-09-06 print addworkdays(today, 20) # 2010-09-29 print addworkdays(today, -1) # 2010-08-31 print addworkdays(today, -3) # 2010-08-27 print addworkdays(today, -20) # 2010-08-04
Para especificar los días festivos deben pasar un iterable (un tupple o una lista) con las días que serían días hábiles si no fueran declarados festivos. IMPORTANTE: Solo pasen los festivos que caen entre lunes a viernes. No pasen, por ejemplo, el Domingo de Ramos.
Por ejemplo, los siguientes son los días festivos para Colombia sacados de Wikipedia (Solo los que quedan del 2010 y uno que ya pasó para probar):
holidays2010 = (
date(2010, 8, 16), date(2010, 10, 18),
date(2010, 11, 1), date(2010, 11, 15),
date(2010, 12, 8),
)
print addworkdays(today, 100) # 2011-01-19
print addworkdays(today, 100, holidays2010) # 2011-01-25
print addworkdays(today, -20) # 2010-08-04
print addworkdays(today, -20, holidays2010) # 2010-08-05
Licencia: MIT