Created
July 9, 2012 17:18
-
-
Save virhilo/3077726 to your computer and use it in GitHub Desktop.
Counting business days between 2 dates
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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