Skip to content

Instantly share code, notes, and snippets.

@kadereub
Last active May 8, 2022 18:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kadereub/980177704a99d719b34b30d6017ba225 to your computer and use it in GitHub Desktop.
Save kadereub/980177704a99d719b34b30d6017ba225 to your computer and use it in GitHub Desktop.
A Python (pandas) holiday calendar for South Africa - for which there are many public holidays!
# [1] https://github.com/pandas-dev/pandas/blob/main/pandas/tseries/holiday.py
from pandas.tseries.offsets import CDay, Day
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, sunday_to_monday, \
DateOffset, MO, next_monday, next_monday_or_tuesday, GoodFriday, EasterMonday
class Holidays_South_Africa(AbstractHolidayCalendar):
rules = [
Holiday('New Years Day', month=1, day=1, observance=next_monday),
Holiday('Human Rights Day', month=3, day=21, observance=sunday_to_monday),
GoodFriday, EasterMonday, # Easter/Family Day
Holiday('Freedom Day', month=4, day=27, observance=sunday_to_monday),
Holiday('International Workers Day', month=5, day=2, observance=sunday_to_monday),
Holiday('Youth Day', month=6, day=16, observance=sunday_to_monday),
Holiday('National Womens Day', month=8, day=9, observance=sunday_to_monday),
Holiday('Heritage Day', month=9, day=24, observance=sunday_to_monday),
Holiday('Day of Reconciliation', month=12, day=16, observance=sunday_to_monday),
Holiday('Christmas Day', month=12, day=25, observance=sunday_to_monday), # not sure if next_monday?
Holiday('Boxing Day', month=12, day=26, observance=next_monday_or_tuesday)
]
if __name__ == "__main__":
from datetime import datetime
today = datetime.now()
sa_bday = CDay(calendar=Holidays_South_Africa())
# go back one business day
print(f"Prev cob date: {today - sa_bday*1}")
print(f" Business date 20 days ago: {today - sa_bday*20}")
print(f"Business Days in April 2022: {pd.date_range(start='2022-04-01', end='2022-04-30', freq=sa_bday)}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment