Opa_omroep-automatiseren/venv/lib/python3.8/site-packages/holidays/countries/united_states.py
Eljakim Herrewijnen f26bbbf103 initial
2020-12-27 21:00:11 +01:00

549 lines
22 KiB
Python

# -*- coding: utf-8 -*-
# python-holidays
# ---------------
# A fast, efficient Python library for generating country, province and state
# specific sets of holidays on the fly. It aims to make determining whether a
# specific date is a holiday as fast and flexible as possible.
#
# Author: ryanss <ryanssdev@icloud.com> (c) 2014-2017
# dr-prodigy <maurizio.montel@gmail.com> (c) 2017-2020
# Website: https://github.com/dr-prodigy/python-holidays
# License: MIT (see LICENSE file)
from datetime import date
from dateutil.easter import easter
from dateutil.relativedelta import relativedelta as rd, MO, FR, TH, TU
from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, \
OCT, \
NOV, DEC
from holidays.constants import MON, WED, FRI, SAT, SUN, WEEKEND
from holidays.holiday_base import HolidayBase
class UnitedStates(HolidayBase):
# https://en.wikipedia.org/wiki/Public_holidays_in_the_United_States
STATES = ['AL', 'AK', 'AS', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FL',
'GA', 'GU', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME',
'MD', 'MH', 'MA', 'MI', 'FM', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV',
'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'MP', 'OH', 'OK', 'OR', 'PW',
'PA', 'PR', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'VI',
'WA', 'WV', 'WI', 'WY']
def __init__(self, **kwargs):
self.country = 'US'
HolidayBase.__init__(self, **kwargs)
def _populate(self, year):
# New Year's Day
if year > 1870:
name = "New Year's Day"
self[date(year, JAN, 1)] = name
if self.observed and date(year, JAN, 1).weekday() == SUN:
self[date(year, JAN, 1) + rd(days=+1)] = name + \
" (Observed)"
elif self.observed \
and date(year, JAN, 1).weekday() == SAT:
# Add Dec 31st from the previous year without triggering
# the entire year to be added
expand = self.expand
self.expand = False
self[date(year, JAN, 1) + rd(days=-1)] = name + \
" (Observed)"
self.expand = expand
# The next year's observed New Year's Day can be in this year
# when it falls on a Friday (Jan 1st is a Saturday)
if self.observed and date(year, DEC, 31).weekday() == FRI:
self[date(year, DEC, 31)] = name + " (Observed)"
# Epiphany
if self.state == 'PR':
self[date(year, JAN, 6)] = "Epiphany"
# Three King's Day
if self.state == 'VI':
self[date(year, JAN, 6)] = "Three King's Day"
# Lee Jackson Day
name = "Lee Jackson Day"
if self.state == 'VA' and year >= 2000:
dt = date(year, JAN, 1) + rd(weekday=MO(+3)) + rd(
weekday=FR(-1))
self[dt] = name
elif self.state == 'VA' and year >= 1983:
self[date(year, JAN, 1) + rd(weekday=MO(+3))] = name
elif self.state == 'VA' and year >= 1889:
self[date(year, JAN, 19)] = name
# Inauguration Day
if self.state in ('DC', 'LA', 'MD', 'VA') and year >= 1789:
name = "Inauguration Day"
if (year - 1789) % 4 == 0 and year >= 1937:
self[date(year, JAN, 20)] = name
if date(year, JAN, 20).weekday() == SUN:
self[date(year, JAN, 21)] = name + " (Observed)"
elif (year - 1789) % 4 == 0:
self[date(year, MAR, 4)] = name
if date(year, MAR, 4).weekday() == SUN:
self[date(year, MAR, 5)] = name + " (Observed)"
# Martin Luther King Jr. Day
if year >= 1986:
name = "Martin Luther King Jr. Day"
if self.state == 'AL':
name = "Robert E. Lee/Martin Luther King Birthday"
elif (self.state == 'MS') or ((self.state == 'AR') and
(year <= 2017)):
name = ("Dr. Martin Luther King Jr. "
"and Robert E. Lee's Birthdays")
elif self.state in ('AZ', 'NH'):
name = "Dr. Martin Luther King Jr./Civil Rights Day"
elif self.state == 'GA' and year < 2012:
name = "Robert E. Lee's Birthday"
elif self.state == 'ID' and year >= 2006:
name = "Martin Luther King Jr. - Idaho Human Rights Day"
self[date(year, JAN, 1) + rd(weekday=MO(+3))] = name
# Lincoln's Birthday
name = "Lincoln's Birthday"
if (self.state in ('CT', 'IL', 'IA', 'NJ', 'NY') and year >= 1971) \
or (self.state == 'CA' and 1971 <= year <= 2009):
self[date(year, FEB, 12)] = name
if self.observed \
and date(year, FEB, 12).weekday() == SAT:
self[date(year, FEB, 11)] = name + " (Observed)"
elif self.observed \
and date(year, FEB, 12).weekday() == SUN:
self[date(year, FEB, 13)] = name + " (Observed)"
# Susan B. Anthony Day
if (self.state == 'CA' and year >= 2014) \
or (self.state == 'FL' and year >= 2011) \
or (self.state == 'NY' and year >= 2004) \
or (self.state == 'WI' and year >= 1976):
self[date(year, FEB, 15)] = "Susan B. Anthony Day"
# Washington's Birthday
name = "Washington's Birthday"
if self.state == 'AL':
name = "George Washington/Thomas Jefferson Birthday"
elif self.state == 'AR':
name = "George Washington's Birthday and Daisy Gatson Bates Day"
elif self.state in ('PR', 'VI'):
name = "Presidents' Day"
if self.state not in ('DE', 'FL', 'GA', 'NM', 'PR'):
if year > 1970:
self[date(year, FEB, 1) + rd(weekday=MO(+3))] = name
elif year >= 1879:
self[date(year, FEB, 22)] = name
elif self.state == 'GA':
if date(year, DEC, 24).weekday() != WED:
self[date(year, DEC, 24)] = name
else:
self[date(year, DEC, 26)] = name
elif self.state in ('PR', 'VI'):
self[date(year, FEB, 1) + rd(weekday=MO(+3))] = name
# Mardi Gras
if self.state == 'LA' and year >= 1857:
self[easter(year) + rd(days=-47)] = "Mardi Gras"
# Guam Discovery Day
if self.state == 'GU' and year >= 1970:
self[date(year, MAR, 1) + rd(weekday=MO)] = "Guam Discovery Day"
# Casimir Pulaski Day
if self.state == 'IL' and year >= 1978:
self[date(year, MAR, 1) + rd(weekday=MO)] = "Casimir Pulaski Day"
# Texas Independence Day
if self.state == 'TX' and year >= 1874:
self[date(year, MAR, 2)] = "Texas Independence Day"
# Town Meeting Day
if self.state == 'VT' and year >= 1800:
self[date(year, MAR, 1) + rd(weekday=TU)] = "Town Meeting Day"
# Evacuation Day
if self.state == 'MA' and year >= 1901:
name = "Evacuation Day"
self[date(year, MAR, 17)] = name
if date(year, MAR, 17).weekday() in WEEKEND:
self[date(year, MAR, 17) + rd(weekday=MO)] = name + \
" (Observed)"
# Emancipation Day
if self.state == 'PR':
self[date(year, MAR, 22)] = "Emancipation Day"
if self.observed and date(year, MAR, 22).weekday() == SUN:
self[date(year, MAR, 23)] = "Emancipation Day (Observed)"
# Prince Jonah Kuhio Kalanianaole Day
if self.state == 'HI' and year >= 1949:
name = "Prince Jonah Kuhio Kalanianaole Day"
self[date(year, MAR, 26)] = name
if self.observed and date(year, MAR, 26).weekday() == SAT:
self[date(year, MAR, 25)] = name + " (Observed)"
elif self.observed and date(year, MAR, 26).weekday() == SUN:
self[date(year, MAR, 27)] = name + " (Observed)"
# Steward's Day
name = "Steward's Day"
if self.state == 'AK' and year >= 1955:
self[date(year, APR, 1) + rd(days=-1, weekday=MO(-1))] = name
elif self.state == 'AK' and year >= 1918:
self[date(year, MAR, 30)] = name
# César Chávez Day
name = "César Chávez Day"
if self.state == 'CA' and year >= 1995:
self[date(year, MAR, 31)] = name
if self.observed and date(year, MAR, 31).weekday() == SUN:
self[date(year, APR, 1)] = name + " (Observed)"
elif self.state == 'TX' and year >= 2000:
self[date(year, MAR, 31)] = name
# Transfer Day
if self.state == 'VI':
self[date(year, MAR, 31)] = "Transfer Day"
# Emancipation Day
if self.state == 'DC' and year >= 2005:
name = "Emancipation Day"
self[date(year, APR, 16)] = name
if self.observed and date(year, APR, 16).weekday() == SAT:
self[date(year, APR, 15)] = name + " (Observed)"
elif self.observed and date(year, APR, 16).weekday() == SUN:
self[date(year, APR, 17)] = name + " (Observed)"
# Patriots' Day
if self.state in ('ME', 'MA') and year >= 1969:
self[date(year, APR, 1) + rd(weekday=MO(+3))] = "Patriots' Day"
elif self.state in ('ME', 'MA') and year >= 1894:
self[date(year, APR, 19)] = "Patriots' Day"
# Holy Thursday
if self.state == 'VI':
self[easter(year) + rd(weekday=TH(-1))] = "Holy Thursday"
# Good Friday
if self.state in ('CT', 'DE', 'GU', 'IN', 'KY', 'LA',
'NJ', 'NC', 'PR', 'TN', 'TX', 'VI'):
self[easter(year) + rd(weekday=FR(-1))] = "Good Friday"
# Easter Monday
if self.state == 'VI':
self[easter(year) + rd(weekday=MO)] = "Easter Monday"
# Confederate Memorial Day
name = "Confederate Memorial Day"
if self.state in ('AL', 'GA', 'MS', 'SC') and year >= 1866:
if self.state == 'GA' and year >= 2016:
name = "State Holiday"
if self.state == 'GA' and year == 2020:
self[date(year, APR, 10)] = name
else:
self[date(year, APR, 1) + rd(weekday=MO(+4))] = name
elif self.state == 'TX' and year >= 1931:
self[date(year, JAN, 19)] = name
# San Jacinto Day
if self.state == 'TX' and year >= 1875:
self[date(year, APR, 21)] = "San Jacinto Day"
# Arbor Day
if self.state == 'NE' and year >= 1989:
self[date(year, APR, 30) + rd(weekday=FR(-1))] = "Arbor Day"
elif self.state == 'NE' and year >= 1875:
self[date(year, APR, 22)] = "Arbor Day"
# Primary Election Day
if self.state == 'IN' and \
((year >= 2006 and year % 2 == 0) or year >= 2015):
dt = date(year, MAY, 1) + rd(weekday=MO)
self[dt + rd(days=+1)] = "Primary Election Day"
# Truman Day
if self.state == 'MO' and year >= 1949:
name = "Truman Day"
self[date(year, MAY, 8)] = name
if self.observed and date(year, MAY, 8).weekday() == SAT:
self[date(year, MAY, 7)] = name + " (Observed)"
elif self.observed and date(year, MAY, 8).weekday() == SUN:
self[date(year, MAY, 10)] = name + " (Observed)"
# Memorial Day
if year > 1970:
self[date(year, MAY, 31) + rd(weekday=MO(-1))] = "Memorial Day"
elif year >= 1888:
self[date(year, MAY, 30)] = "Memorial Day"
# Jefferson Davis Birthday
name = "Jefferson Davis Birthday"
if self.state == 'AL' and year >= 1890:
self[date(year, JUN, 1) + rd(weekday=MO)] = name
# Kamehameha Day
if self.state == 'HI' and year >= 1872:
self[date(year, JUN, 11)] = "Kamehameha Day"
if self.observed and year >= 2011:
if date(year, JUN, 11).weekday() == SAT:
self[date(year, JUN, 10)] = "Kamehameha Day (Observed)"
elif date(year, JUN, 11).weekday() == SUN:
self[date(year, JUN, 12)] = "Kamehameha Day (Observed)"
# Emancipation Day In Texas
if self.state == 'TX' and year >= 1980:
self[date(year, JUN, 19)] = "Emancipation Day In Texas"
# West Virginia Day
name = "West Virginia Day"
if self.state == 'WV' and year >= 1927:
self[date(year, JUN, 20)] = name
if self.observed and date(year, JUN, 20).weekday() == SAT:
self[date(year, JUN, 19)] = name + " (Observed)"
elif self.observed and date(year, JUN, 20).weekday() == SUN:
self[date(year, JUN, 21)] = name + " (Observed)"
# Emancipation Day in US Virgin Islands
if self.state == 'VI':
self[date(year, JUL, 3)] = "Emancipation Day"
# Independence Day
if year > 1870:
name = "Independence Day"
self[date(year, JUL, 4)] = name
if self.observed and date(year, JUL, 4).weekday() == SAT:
self[date(year, JUL, 4) + rd(days=-1)] = name + " (Observed)"
elif self.observed and date(year, JUL, 4).weekday() == SUN:
self[date(year, JUL, 4) + rd(days=+1)] = name + " (Observed)"
# Liberation Day (Guam)
if self.state == 'GU' and year >= 1945:
self[date(year, JUL, 21)] = "Liberation Day (Guam)"
# Pioneer Day
if self.state == 'UT' and year >= 1849:
name = "Pioneer Day"
self[date(year, JUL, 24)] = name
if self.observed and date(year, JUL, 24).weekday() == SAT:
self[date(year, JUL, 24) + rd(days=-1)] = name + " (Observed)"
elif self.observed and date(year, JUL, 24).weekday() == SUN:
self[date(year, JUL, 24) + rd(days=+1)] = name + " (Observed)"
# Constitution Day
if self.state == 'PR':
self[date(year, JUL, 25)] = "Constitution Day"
if self.observed and date(year, JUL, 25).weekday() == SUN:
self[date(year, JUL, 26)] = "Constitution Day (Observed)"
# Victory Day
if self.state == 'RI' and year >= 1948:
self[date(year, AUG, 1) + rd(weekday=MO(+2))] = "Victory Day"
# Statehood Day (Hawaii)
if self.state == 'HI' and year >= 1959:
self[date(year, AUG, 1) + rd(weekday=FR(+3))] = "Statehood Day"
# Bennington Battle Day
if self.state == 'VT' and year >= 1778:
name = "Bennington Battle Day"
self[date(year, AUG, 16)] = name
if self.observed and date(year, AUG, 16).weekday() == SAT:
self[date(year, AUG, 15)] = name + " (Observed)"
elif self.observed and date(year, AUG, 16).weekday() == SUN:
self[date(year, AUG, 17)] = name + " (Observed)"
# Lyndon Baines Johnson Day
if self.state == 'TX' and year >= 1973:
self[date(year, AUG, 27)] = "Lyndon Baines Johnson Day"
# Labor Day
if year >= 1894:
self[date(year, SEP, 1) + rd(weekday=MO)] = "Labor Day"
# Columbus Day
if self.state not in ('AK', 'AR', 'DE', 'FL', 'HI', 'NV'):
if self.state == 'SD':
name = "Native American Day"
elif self.state == 'VI':
name = "Columbus Day and Puerto Rico Friendship Day"
else:
name = "Columbus Day"
if year >= 1970:
self[date(year, OCT, 1) + rd(weekday=MO(+2))] = name
elif year >= 1937:
self[date(year, OCT, 12)] = name
# Alaska Day
if self.state == 'AK' and year >= 1867:
name = "Alaska Day"
self[date(year, OCT, 18)] = name
if self.observed \
and date(year, OCT, 18).weekday() == SAT:
self[date(year, OCT, 18) + rd(days=-1)] = name + \
" (Observed)"
elif self.observed \
and date(year, OCT, 18).weekday() == SUN:
self[date(year, OCT, 18) + rd(days=+1)] = name + \
" (Observed)"
# Nevada Day
if self.state == 'NV' and year >= 1933:
dt = date(year, OCT, 31)
if year >= 2000:
dt += rd(weekday=FR(-1))
self[dt] = "Nevada Day"
if self.observed and dt.weekday() == SAT:
self[dt + rd(days=-1)] = "Nevada Day (Observed)"
elif self.observed and dt.weekday() == SUN:
self[dt + rd(days=+1)] = "Nevada Day (Observed)"
# Liberty Day
if self.state == 'VI':
self[date(year, NOV, 1)] = "Liberty Day"
# Election Day
if (self.state in ('DE', 'HI', 'IL', 'IN', 'LA',
'MT', 'NH', 'NJ', 'NY', 'WV') and
year >= 2008 and year % 2 == 0) \
or (self.state in ('IN', 'NY') and year >= 2015):
dt = date(year, NOV, 1) + rd(weekday=MO)
self[dt + rd(days=+1)] = "Election Day"
# All Souls' Day
if self.state == 'GU':
self[date(year, NOV, 2)] = "All Souls' Day"
# Veterans Day
if year > 1953:
name = "Veterans Day"
else:
name = "Armistice Day"
if 1978 > year > 1970:
self[date(year, OCT, 1) + rd(weekday=MO(+4))] = name
elif year >= 1938:
self[date(year, NOV, 11)] = name
if self.observed \
and date(year, NOV, 11).weekday() == SAT:
self[date(year, NOV, 11) + rd(days=-1)] = name + \
" (Observed)"
elif self.observed \
and date(year, NOV, 11).weekday() == SUN:
self[date(year, NOV, 11) + rd(days=+1)] = name + \
" (Observed)"
# Discovery Day
if self.state == 'PR':
self[date(year, NOV, 19)] = "Discovery Day"
if self.observed and date(year, NOV, 19).weekday() == SUN:
self[date(year, NOV, 20)] = "Discovery Day (Observed)"
# Thanksgiving
if year > 1870:
self[date(year, NOV, 1) + rd(weekday=TH(+4))] = "Thanksgiving"
# Day After Thanksgiving
# Friday After Thanksgiving
# Lincoln's Birthday
# American Indian Heritage Day
# Family Day
# New Mexico Presidents' Day
if (self.state in ('CA', 'DE', 'FL', 'NH', 'NC', 'OK', 'TX', 'WV') and
year >= 1975) \
or (self.state == 'IN' and year >= 2010) \
or (self.state == 'MD' and year >= 2008) \
or self.state in ('NV', 'NM'):
if self.state in ('CA', 'DE', 'NH', 'NC', 'OK', 'WV'):
name = "Day After Thanksgiving"
elif self.state in ('FL', 'TX'):
name = "Friday After Thanksgiving"
elif self.state == 'IN':
name = "Lincoln's Birthday"
elif self.state == 'MD' and year >= 2008:
name = "American Indian Heritage Day"
elif self.state == 'NV':
name = "Family Day"
elif self.state == 'NM':
name = "Presidents' Day"
dt = date(year, NOV, 1) + rd(weekday=TH(+4))
self[dt + rd(days=+1)] = name
# Robert E. Lee's Birthday
if self.state == 'GA' and year >= 1986:
if year >= 2016:
name = "State Holiday"
else:
name = "Robert E. Lee's Birthday"
self[date(year, NOV, 29) + rd(weekday=FR(-1))] = name
# Lady of Camarin Day
if self.state == 'GU':
self[date(year, DEC, 8)] = "Lady of Camarin Day"
# Christmas Eve
if self.state == 'AS' or \
(self.state in ('KS', 'MI', 'NC') and year >= 2013) or \
(self.state == 'TX' and year >= 1981) or \
(self.state == 'WI' and year >= 2012):
name = "Christmas Eve"
self[date(year, DEC, 24)] = name
name = name + " (Observed)"
# If on Friday, observed on Thursday
if self.observed and date(year, DEC, 24).weekday() == FRI:
self[date(year, DEC, 24) + rd(days=-1)] = name
# If on Saturday or Sunday, observed on Friday
elif self.observed \
and date(year, DEC, 24).weekday() in WEEKEND:
self[date(year, DEC, 24) + rd(weekday=FR(-1))] = name
# Christmas Day
if year > 1870:
name = "Christmas Day"
self[date(year, DEC, 25)] = "Christmas Day"
if self.observed \
and date(year, DEC, 25).weekday() == SAT:
self[date(year, DEC, 25) + rd(days=-1)] = name + \
" (Observed)"
elif self.observed \
and date(year, DEC, 25).weekday() == SUN:
self[date(year, DEC, 25) + rd(days=+1)] = name + \
" (Observed)"
# Day After Christmas
if self.state == 'NC' and year >= 2013:
name = "Day After Christmas"
self[date(year, DEC, 26)] = name
name = name + " (Observed)"
# If on Saturday or Sunday, observed on Monday
if self.observed and date(year, DEC, 26).weekday() in WEEKEND:
self[date(year, DEC, 26) + rd(weekday=MO)] = name
# If on Monday, observed on Tuesday
elif self.observed \
and date(year, DEC, 26).weekday() == MON:
self[date(year, DEC, 26) + rd(days=+1)] = name
elif self.state == 'TX' and year >= 1981:
self[date(year, DEC, 26)] = "Day After Christmas"
elif self.state == 'VI':
self[date(year, DEC, 26)] = "Christmas Second Day"
# New Year's Eve
if (self.state in ('KY', 'MI') and year >= 2013) or \
(self.state == 'WI' and year >= 2012):
name = "New Year's Eve"
self[date(year, DEC, 31)] = name
if self.observed \
and date(year, DEC, 31).weekday() == SAT:
self[date(year, DEC, 30)] = name + " (Observed)"
class US(UnitedStates):
pass
class USA(UnitedStates):
pass