Archive

Posts Tagged ‘arithmetic’

Adicionar días hábiles en python

septiembre 1, 2010 Comments off

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