2011-08-29 11 views

risposta

7

provare 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 sembrano depricated: http://pytseries.sourceforge.net/

con i panda invece qualcuno può fare:

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

Non sono sicuro che questa sia la migliore soluzione, ma funziona per me:

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

Oppure sottrarre 2 * (il numero di giorni // 7) e quindi regolare la posizione dei giorni di inizio e fine della settimana se si desidera qualcosa di più veloce. – agf

2

Ecco un O (1) soluzione di classe di complessità che utilizza solo built-in librerie Python.

Ha prestazioni costanti indipendentemente dalla lunghezza dell'intervallo di tempo e non si preoccupa dell'ordine di argomenti.

# 
# 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 
Problemi correlati