2011-08-29 25 views

Respuesta

7

Prueba con scikits.timeseries:

import scikits.timeseries as ts 
import datetime 

a = datetime.datetime(2011,8,1) 
b = datetime.datetime(2011,8,29) 

diff_business_days = ts.Date('B', b) - ts.Date('B', a) 
# returns 20 

o con dateutil:

import datetime 
from dateutil import rrule 

a = datetime.datetime(2011,8,1) 
b = datetime.datetime(2011,8,29) 

diff_business_days = len(list(rrule.rrule(rrule.DAILY, 
              dtstart=a, 
              until=b - datetime.timedelta(days=1), 
              byweekday=(rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR)))) 

scikits.timeseries parecen depricated: http://pytseries.sourceforge.net/

Con pandas vez alguien puede hacer:

import pandas as pd 

a = datetime.datetime(2015, 10, 1) 
b = datetime.datetime(2015, 10, 29) 

diff_calendar_days = pd.date_range(a, b).size 
diff_business_days = pd.bdate_range(a, b).size 
1

No estoy seguro de que esta es la mejor solución, pero funciona para mí:

from datetime import datetime, timedelta 

startDate = datetime(2011, 7, 7) 
endDate = datetime(2011, 10, 7) 
dayDelta = timedelta(days=1) 
diff = 0 
while startDate != endDate: 
    if startDate.weekday() not in [5,6]: 
     diff += 1 
    startDate += dayDelta 
+2

O reste 2 * (el número de días // 7) y luego ajuste la posición de los días de inicio y fin de la semana si desea algo más rápido. – agf

2

Aquí está un O (1) solución de clase de la complejidad que sólo se utiliza una función de bibliotecas de Python.

Tiene un rendimiento constante independientemente de la duración del intervalo de tiempo y no le importa el orden de los argumentos.

# 
# by default, the last date is not inclusive 
# 
def workdaycount(first, second, inc = 0): 
    if first == second: 
     return 0 
    import math 
    if first > second: 
     first, second = second, first 
    if inc: 
     from datetime import timedelta 
     second += timedelta(days=1) 
    interval = (second - first).days 
    weekspan = int(math.ceil(interval/7.0)) 
    if interval % 7 == 0: 
     return interval - weekspan * 2 
    else: 
     wdf = first.weekday() 
     if (wdf < 6) and ((interval + wdf) // 7 == weekspan): 
     modifier = 0 
     elif (wdf == 6) or ((interval + wdf + 1) // 7 == weekspan): 
     modifier = 1 
     else: 
     modifier = 2 
     return interval - (2 * weekspan - modifier) 

# 
# sample usage 
# 
print workdaycount(date(2011, 8, 15), date(2011, 8, 22)) # returns 5 
print workdaycount(date(2011, 8, 15), date(2011, 8, 22), 1) # last date inclusive, returns 6 
Cuestiones relacionadas