2011-08-29 30 views

Trả lời

7

Hãy thử nó với 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 

hoặc với 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 nhìn depricated: http://pytseries.sourceforge.net/

Với gấu trúc thay vì một người nào đó có thể làm:

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

Không chắc rằng đây là một trong những giải pháp tốt nhất nhưng nó làm việc cho tôi:

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

Hoặc trừ 2 * (số ngày // 7) và sau đó điều chỉnh vị trí của ngày bắt đầu và ngày kết thúc trong tuần nếu bạn muốn điều gì đó nhanh hơn. – agf

2

Dưới đây là một O (1) giải pháp lớp phức tạp mà chỉ sử dụng được xây dựng trong thư viện Python.

Nó có hiệu suất không đổi bất kể độ dài khoảng thời gian và không quan tâm đến thứ tự đối số.

# 
# 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 
Các vấn đề liên quan