Te recomendamos que pruebes esta solución en un ambiente controlado antes de pasarlo a producción, un saludo.
Solución:
Recomendaría encarecidamente usar la biblioteca dateutil para tales tareas. Un basico (no ignorando las vacaciones) iterador durante los días hábiles, entonces simplemente es:
from dateutil.rrule import DAILY, rrule, MO, TU, WE, TH, FR
def daterange(start_date, end_date):
return rrule(DAILY, dtstart=start_date, until=end_date, byweekday=(MO,TU,WE,TH,FR))
Asumiendo startDate
y endDate
son objetos de fecha y hora, puede usar el weekday
método para obtener el día de la semana, luego omítalo si es sábado o domingo. Solo haz:
def daterange(startDate, endDate):
for i in xrange(int((endDate - startDate).days)):
nextDate = startDate + timedelta(i)
if nextDate.weekday() not in (5, 6):
yield startDate + timedelta(i)
Para las vacaciones, tendrá que comprobar manualmente las vacaciones que desee. Algunas vacaciones se definen de manera compleja, por lo que esto podría ser un poco complicado.
Hay una biblioteca útil llamada dateutil
que puede hacer este tipo de cosas por ti. Puede generar rangos de fechas (o fechas basadas en reglas personalizadas), excluyendo ciertos días, considerar una semana que comienza en un día, etc. También tiene un timedelta algo más flexible que la biblioteca de fecha y hora incorporada.
Docs en http://labix.org/python-dateutil/ – y disponible en PyPi
Comentarios y valoraciones del post
Si te ha resultado útil nuestro post, nos gustaría que lo compartas con otros juniors y nos ayudes a dar difusión a este contenido.