diff options
| author | Steven <steven1170@zoho.eu> | 2024-03-11 17:56:09 +0000 |
|---|---|---|
| committer | Steven <steven1170@zoho.eu> | 2024-03-11 17:56:09 +0000 |
| commit | f614ef1237a06089da652d5dcc3a927a1846fd22 (patch) | |
| tree | af0878cf8ab01d249582ac2281076d1f461226d5 /challenge-259 | |
| parent | 77245595e193396bdb9347f5b5de7a088aea8bae (diff) | |
| download | perlweeklychallenge-club-f614ef1237a06089da652d5dcc3a927a1846fd22.tar.gz perlweeklychallenge-club-f614ef1237a06089da652d5dcc3a927a1846fd22.tar.bz2 perlweeklychallenge-club-f614ef1237a06089da652d5dcc3a927a1846fd22.zip | |
add solutions week 259 260 task 1 in python
Diffstat (limited to 'challenge-259')
| -rw-r--r-- | challenge-259/steven-wilson/python/ch-1.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/challenge-259/steven-wilson/python/ch-1.py b/challenge-259/steven-wilson/python/ch-1.py new file mode 100644 index 0000000000..fe8d448022 --- /dev/null +++ b/challenge-259/steven-wilson/python/ch-1.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 + +from datetime import timedelta +from datetime import date + + +def banking_day_offset(start_date, offset, bank_holidays=None): + ''' Given a number (of days) and a start date, return the number (of days) + adjusted to take into account non-banking days. In other words: convert a + banking day offset to a calendar day offset. + + >>> banking_day_offset('2018-06-28', 3, ['2018-07-03']) + '2018-07-04' + >>> banking_day_offset('2018-06-28', 3) + '2018-07-03' + ''' + if bank_holidays is None: + bank_holidays = [] + + if not isinstance(offset, int) or offset < 0: + raise ValueError(f"{offset} is not a valid offset") + + try: + odate = date.fromisoformat(start_date) + except ValueError: + raise ValueError(f"{start_date} is not a valid iso format start date") + + for holiday in bank_holidays: + try: + date.fromisoformat(holiday) + except ValueError: + raise ValueError(f"{holiday} is not a valid iso format bank holiday") + + weekend = [5, 6] + + for _ in range(offset): + odate += timedelta(days=1) + while odate.weekday() in weekend or odate.isoformat() in bank_holidays: + odate += timedelta(days=1) + + return odate.isoformat() + + +if __name__ == "__main__": + import doctest + + doctest.testmod() |
