from datetime import timedelta
def diff(s, e):
_diff = (end_date - start_date)
while s < e:
if s.weekday() in {5, 6}:
_diff -= timedelta(days=1)
s += timedelta(days=1)
return timedelta(seconds=_diff.total_seconds())
, , :
from datetime import timedelta
def helper(d):
if d.weekday() == 5:
d += timedelta(days=1)
return d.replace(hour=0, minute=0, second=0, microsecond=0)
def diff(s, e):
if e.weekday() in {5, 6}:
e = helper(e)
if s.weekday() in {5, 6}:
s = helper(s)
_diff = (e - s)
while s < e:
if s.weekday() in {5, 6}:
_diff -= timedelta(days=1)
elif s.weekday() == 0:
s += timedelta(days=4)
s += timedelta(days=1)
return timedelta(seconds=_diff.total_seconds())
- :
In [57]: timeit time_between_two_dates_except_weekends(start_date,end_date)
10 loops, best of 3: 95.5 ms per loop
In [58]: timeit diff(start_date,end_date)
100 loops, best of 3: 12.4 ms per loop
In [59]: diff(start_date,end_date)
Out[59]: datetime.timedelta(7699, 9300)
In [60]: time_between_two_dates_except_weekends(start_date,end_date)
Out[60]: datetime.timedelta(7699, 9300)
:
from datetime import timedelta, datetime
def helper(d):
if d.weekday() == 5:
d += timedelta(days=1)
return d.replace(hour=0, minute=0, second=0, microsecond=0)
def diff(s, e):
weekend = {5, 6}
both = e.weekday() in weekend and s.weekday() in weekend
is_weekend = e.weekday() in {5, 6} or s.weekday() in {5, 6}
if e.weekday() in weekend:
e = helper(e)
if s.weekday() in weekend:
s = helper(s)
_diff = (e - s)
wek = _diff.days / 7 * 2 + is_weekend - both
if s.weekday() > e.weekday() and not is_weekend:
wek += 2
return timedelta(seconds=_diff.total_seconds()) - timedelta(wek)
:
In [2]: start_date = datetime(2016, 02, 29, 21, 25, 0)
In [3]: end_date = datetime(2045, 9, 02, 03, 56, 0)
In [4]: timeit diff(start_date,end_date)
100000 loops, best of 3: 6.8 µs per loop
In [5]: diff(start_date,end_date)
Out[5]: datetime.timedelta(7699, 9300)