¿Cómo encontrar el número de lunes o cualquier otro día de la semana entre dos fechas en Python?

Tengo dos fechas entre las cuales necesito averiguar cuántos de lunes a viernes vienen (excepto Sta, Sun), todos los días se deben contar.

Actualmente estoy pensando en esto:

import calendar import datetime start_date = datetime.datetime.strptime("01/01/2017",'%d/%m/%Y') end_date = datetime.datetime.strptime("31/01/2017",'%d/%m/%Y') week_arr = [0] * 7 calendar.day_name[start_date.weekday()] ## will give me name of day """ As I receive Monday I will increment week_arr[0] by 1, Tuesday week_arr[1]+= 1, """ 

No entiendo cómo hacerlo de manera efectiva, así que no uso mucha línea de código (menos si -else y para bucles), puede haber algunos trucos en los pandas.

Este código todavía utiliza un bucle for y un if / else.

 import datetime import calendar def weekday_count(start, end): start_date = datetime.datetime.strptime(start, '%d/%m/%Y') end_date = datetime.datetime.strptime(end, '%d/%m/%Y') week = {} for i in range((end_date - start_date).days): day = calendar.day_name[(start_date + datetime.timedelta(days=i+1)).weekday()] week[day] = week[day] + 1 if day in week else 1 return week print(weekday_count("01/01/2017", "31/01/2017")) # prints result # {'Monday': 5, 'Tuesday': 5, 'Friday': 4, 'Wednesday': 4, 'Thursday': 4, 'Sunday': 5, 'Saturday': 4} 

Puedes definir una función y usarla así:

 def num_days_between( start, end, week_day): num_weeks, remainder = divmod( (end-start).days, 7) if ( week_day - start.weekday() ) % 7 <= remainder: return num_weeks + 1 else: return num_weeks 

donde week_day es el número de día que desea calcular.

Esto es eficiente, incluso frente a los diez mil días entre el inicio y el final, y aún así es muy flexible (itera como máximo 7 veces dentro de la función de sum):

 def intervening_weekdays(start, end, inclusive=True, weekdays=[0, 1, 2, 3, 4]): if isinstance(start, datetime.datetime): start = start.date() # make a date from a datetime if isinstance(end, datetime.datetime): end = end.date() # make a date from a datetime if end < start: # you can opt to return 0 or swap the dates around instead raise ValueError("start date must be before end date") if inclusive: end += datetime.timedelta(days=1) # correct for inclusivity try: # collapse duplicate weekdays weekdays = {weekday % 7 for weekday in weekdays} except TypeError: weekdays = [weekdays % 7] ref = datetime.date.today() # choose a reference date ref -= datetime.timedelta(days=ref.weekday()) # and normalize its weekday # sum up all selected weekdays (max 7 iterations) return sum((ref_plus - start).days // 7 - (ref_plus - end).days // 7 for ref_plus in (ref + datetime.timedelta(days=weekday) for weekday in weekdays)) 

Esto toma tanto datetime.date como los objetos datetime.datetime para el start y el end , respectivamente.

Además, puede elegir entre un intervalo cerrado ( inclusive=True ) y medio abierto ( inclusive=False ).

Por defecto, calcula el número de días laborables entre las fechas, pero también puede elegir cualquier conjunto de días de la semana (días de fin de semana: días weekdays=[5, 6] ) o solo días de la semana (miércoles: weekdays=2 ).