Skip to content

Instantly share code, notes, and snippets.

@virhilo
Created July 9, 2012 17:18
Show Gist options
  • Save virhilo/3077726 to your computer and use it in GitHub Desktop.
Save virhilo/3077726 to your computer and use it in GitHub Desktop.
Counting business days between 2 dates
import unittest
from datetime import datetime, timedelta
def business_days(start, end):
"""
Calculating business days between two dates excluding weekends
:param start: First date
:param end: Second date
:rtype: integer
"""
days = (end - start).days
(full_weeks, remaining_days) = divmod(days, 7)
business_days_count = full_weeks * 5
if not remaining_days:
return business_days_count
full_weeks_dt = start + timedelta(days=full_weeks * 7)
max_weekday = full_weeks_dt.isoweekday() + remaining_days
if max_weekday > 7:
remaining_days -= 2
elif max_weekday > 6:
remaining_days -= 1
return business_days_count + remaining_days
class BusinessDaysTest(unittest.TestCase):
def test_full_weeks(self):
dates_results = (
(datetime(2012, 7, 9), datetime(2012, 7, 16), 5),
(datetime(2012, 7, 3), datetime(2012, 7, 24), 15),
)
for date1, date2, expected in dates_results:
self.assertEqual(business_days(date1, date2), expected)
def test_partial_Weeks(self):
dates_results = (
(datetime(2012, 7, 9), datetime(2012, 7, 14), 5),
(datetime(2012, 7, 3), datetime(2012, 7, 20), 13),
(datetime(2012, 6, 25), datetime(2012, 7, 11), 12),
)
for date1, date2, expected in dates_results:
self.assertEqual(business_days(date1, date2), expected)
if __name__ == '__main__':
unittest.main()
virhilo@sl500:~$ python buisness_timedelta.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment