diff --git a/AUTHORS b/AUTHORS index 7957507aa..4d0f2cbdc 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,6 +13,7 @@ Alexei Mikhailov Anders Wenhaug Andrei Klimenko Andres Marrugo +Ankush Kapoor Anon Kangpanich Anthony Rose Anton Daitche diff --git a/README.rst b/README.rst index 70fc1d9e2..030576224 100644 --- a/README.rst +++ b/README.rst @@ -523,7 +523,7 @@ All other default values are highlighted with bold: - HALF_DAY * - India - IN - - States: AN, AP, AR, AS, BR, CG, CH, DH, DL, GA, GJ, HP, HR, JH, JK, KA, KL, LA, LD, MH, ML, MN, MP, MZ, NL, OD, PB, PY, RJ, SK, TN, TR, TS, UK, UP, WB + - States: AN (Andaman and Nicobar Islands), AP (Andhra Pradesh), AR (Arunachal Pradesh, Arunāchal Pradesh), AS (Assam), BR (Bihar, Bihār), CG (Chhattisgarh, Chhattīsgarh), CH (Chandigarh, Chandīgarh), DH (Dadra and Nagar Haveli and Daman and Diu, Dādra and Nagar Haveli and Damān and Diu), DL (Delhi), GA (Goa), GJ (Gujarat, Gujarāt), HP (Himachal Pradesh, Himāchal Pradesh), HR (Haryana, Haryāna), JH (Jharkhand, Jhārkhand), JK (Jammu and Kashmir, Jammu and Kashmīr), KA (Karnataka, Karnātaka), KL (Kerala), LA (Ladakh, Ladākh), LD (Lakshadweep), MH (Maharashtra, Mahārāshtra), ML (Meghalaya, Meghālaya), MN (Manipur), MP (Madhya Pradesh), MZ (Mizoram), NL (Nagaland, Nāgāland), OD (Odisha), PB (Punjab), PY (Puducherry), RJ (Rajasthan, Rājasthān), SK (Sikkim), TN (Tamil Nadu, Tamil Nādu), TR (Tripura), TS (Telangana, Telangāna), UK (Uttarakhand, Uttarākhand), UP (Uttar Pradesh), WB (West Bengal) - - * - Indonesia diff --git a/holidays/countries/india.py b/holidays/countries/india.py index b6a5e4fd8..f2acf706a 100644 --- a/holidays/countries/india.py +++ b/holidays/countries/india.py @@ -12,7 +12,7 @@ import warnings -from holidays.calendars.gregorian import MAR, OCT, NOV +from holidays.calendars.gregorian import JAN, FEB, MAR, APR, OCT, NOV, AUG, SEP, DEC from holidays.groups import ChristianHolidays, InternationalHolidays, IslamicHolidays from holidays.holiday_base import HolidayBase @@ -31,38 +31,38 @@ class India(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolida subdivisions = ( "AN", # Andaman and Nicobar Islands. "AP", # Andhra Pradesh. - "AR", # Arunāchal Pradesh. + "AR", # Arunachal Pradesh (Arunāchal Pradesh). "AS", # Assam. - "BR", # Bihār. - "CG", # Chhattīsgarh. - "CH", # Chandīgarh. - "DH", # Dādra and Nagar Haveli and Damān and Diu. + "BR", # Bihar (Bihār). + "CG", # Chattisgarh (Chhattīsgarh). + "CH", # Chandigarh (Chandīgarh). + "DH", # Dadra and Nagar Haveli and Daman and Diu(Dādra and Nagar Haveli and Damān and Diu) "DL", # Delhi. "GA", # Goa. - "GJ", # Gujarāt. - "HP", # Himāchal Pradesh. - "HR", # Haryāna. - "JH", # Jhārkhand. - "JK", # Jammu and Kashmīr. - "KA", # Karnātaka. + "GJ", # Gujarat (Gujarāt). + "HP", # Himachal Pradesh (Himāchal Pradesh). + "HR", # Haryana (Haryāna). + "JH", # Jharkhand (Jhārkhand). + "JK", # Jammu and Kashmir (Jammu and Kashmīr). + "KA", # Karnataka (Karnātaka). "KL", # Kerala. - "LA", # Ladākh. + "LA", # Ladakh (Ladākh). "LD", # Lakshadweep. - "MH", # Mahārāshtra. - "ML", # Meghālaya. + "MH", # Maharashtra (Mahārāshtra). + "ML", # Meghalaya (Meghālaya). "MN", # Manipur. "MP", # Madhya Pradesh. "MZ", # Mizoram. - "NL", # Nāgāland. + "NL", # Nagaland (Nāgāland). "OD", # Odisha. "PB", # Punjab. "PY", # Puducherry. - "RJ", # Rājasthān. + "RJ", # Rajasthan (Rājasthān). "SK", # Sikkim. - "TN", # Tamil Nādu. + "TN", # Tamil Nadu (Tamil Nādu). "TR", # Tripura. - "TS", # Telangāna. - "UK", # Uttarākhand. + "TS", # Telangana (Telangāna). + "UK", # Uttarakhand (Uttarākhand). "UP", # Uttar Pradesh. "WB", # West Bengal. ) @@ -70,6 +70,63 @@ class India(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolida "DD", # Daman and Diu. "OR", # Orissa. ) + subdivisions_aliases = { + "Andaman and Nicobar Islands": "AN", + "Andhra Pradesh": "AP", + "Arunachal Pradesh": "AR", + "Arunāchal Pradesh": "AR", + "Assam": "AS", + "Bihar": "BR", + "Bihār": "BR", + "Chhattisgarh": "CG", + "Chhattīsgarh": "CG", + "Chandigarh": "CH", + "Chandīgarh": "CH", + "Dadra and Nagar Haveli and Daman and Diu": "DH", + "Dādra and Nagar Haveli and Damān and Diu": "DH", + "Delhi": "DL", + "Goa": "GA", + "Gujarat": "GJ", + "Gujarāt": "GJ", + "Himachal Pradesh": "HP", + "Himāchal Pradesh": "HP", + "Haryana": "HR", + "Haryāna": "HR", + "Jharkhand": "JH", + "Jhārkhand": "JH", + "Jammu and Kashmir": "JK", + "Jammu and Kashmīr": "JK", + "Karnataka": "KA", + "Karnātaka": "KA", + "Kerala": "KL", + "Ladakh": "LA", + "Ladākh": "LA", + "Lakshadweep": "LD", + "Maharashtra": "MH", + "Mahārāshtra": "MH", + "Meghalaya": "ML", + "Meghālaya": "ML", + "Manipur": "MN", + "Madhya Pradesh": "MP", + "Mizoram": "MZ", + "Nagaland": "NL", + "Nāgāland": "NL", + "Odisha": "OD", + "Punjab": "PB", + "Puducherry": "PY", + "Rajasthan": "RJ", + "Rājasthān": "RJ", + "Sikkim": "SK", + "Tamil Nadu": "TN", + "Tamil Nādu": "TN", + "Tripura": "TR", + "Telangana": "TS", + "Telangāna": "TS", + "Uttarakhand": "UK", + "Uttarākhand": "UK", + "Uttar Pradesh": "UP", + "West Bengal": "WB", + } def __init__(self, *args, **kwargs): ChristianHolidays.__init__(self) @@ -78,9 +135,6 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _populate_public_holidays(self): - # Makar Sankranti / Pongal. - self._add_holiday_jan_14("Makar Sankranti / Pongal") - if self._year >= 1950: # Republic Day. self._add_holiday_jan_26("Republic Day") @@ -92,14 +146,17 @@ def _populate_public_holidays(self): # Gandhi Jayanti. self._add_holiday_oct_2("Gandhi Jayanti") + # Children's day + self._add_holiday_nov_14("Children's Day") + # Labour Day. self._add_labor_day("Labour Day") - # Directly lifted Diwali and Holi dates from FBProphet from: - # https://github.com/facebook/prophet/blob/main/python/prophet/hdays.py - # Warnings kept in place so that users are aware - if self._year < 2001 or self._year > 2030: - warning_msg = "Diwali and Holi holidays available from 2001 to 2030 only" + # Makar Sankranti + self._add_makar_sankranti() + + if self._year < 2001 or self._year > 2035: + warning_msg = "Requested Holidays are available only from 2001 to 2035." warnings.warn(warning_msg, Warning) # https://www.timeanddate.com/holidays/india/diwali @@ -134,6 +191,11 @@ def _populate_public_holidays(self): 2028: (OCT, 17), 2029: (NOV, 5), 2030: (OCT, 26), + 2031: (NOV, 14), + 2032: (NOV, 2), + 2033: (OCT, 22), + 2034: (NOV, 10), + 2035: (OCT, 30), } # https://www.timeanddate.com/holidays/india/holi @@ -168,6 +230,322 @@ def _populate_public_holidays(self): 2028: (MAR, 11), 2029: (MAR, 1), 2030: (MAR, 20), + 2031: (MAR, 9), + 2032: (MAR, 27), + 2033: (MAR, 16), + 2034: (MAR, 5), + 2035: (MAR, 24), + } + + # https://www.timeanddate.com/holidays/india/raksha-bandhan + rakhi_dates = { + 2001: (AUG, 4), + 2002: (AUG, 22), + 2003: (AUG, 12), + 2004: (AUG, 29), + 2005: (AUG, 19), + 2006: (AUG, 9), + 2007: (AUG, 28), + 2008: (AUG, 16), + 2009: (AUG, 5), + 2010: (AUG, 24), + 2011: (AUG, 13), + 2012: (AUG, 2), + 2013: (AUG, 20), + 2014: (AUG, 10), + 2015: (AUG, 29), + 2016: (AUG, 18), + 2017: (AUG, 7), + 2018: (AUG, 26), + 2019: (AUG, 15), + 2020: (AUG, 3), + 2021: (AUG, 22), + 2022: (AUG, 11), + 2023: (AUG, 30), + 2024: (AUG, 19), + 2025: (AUG, 9), + 2026: (AUG, 28), + 2027: (AUG, 17), + 2028: (AUG, 5), + 2029: (AUG, 23), + 2030: (AUG, 13), + 2031: (AUG, 2), + 2032: (AUG, 20), + 2033: (AUG, 10), + 2034: (AUG, 29), + 2035: (AUG, 18), + } + + # https://www.timeanddate.com/holidays/india/janmashtami + janmashtami_dates = { + 2001: (AUG, 12), + 2002: (AUG, 31), + 2003: (AUG, 20), + 2004: (SEP, 7), + 2005: (AUG, 27), + 2006: (AUG, 16), + 2007: (SEP, 4), + 2008: (AUG, 24), + 2009: (AUG, 14), + 2010: (SEP, 2), + 2011: (AUG, 22), + 2012: (AUG, 10), + 2013: (AUG, 28), + 2014: (AUG, 18), + 2015: (SEP, 5), + 2016: (AUG, 25), + 2017: (AUG, 15), + 2018: (SEP, 3), + 2019: (AUG, 24), + 2020: (AUG, 12), + 2021: (AUG, 30), + 2022: (AUG, 19), + 2023: (SEP, 7), + 2024: (AUG, 26), + 2025: (AUG, 16), + 2026: (SEP, 4), + 2027: (AUG, 25), + 2028: (AUG, 13), + 2029: (SEP, 1), + 2030: (AUG, 21), + 2031: (AUG, 10), + 2032: (AUG, 28), + 2033: (AUG, 17), + 2034: (SEP, 6), + 2035: (AUG, 26), + } + + # https://www.timeanddate.com/holidays/india/dussehra + dussehra_dates = { + 2001: (OCT, 26), + 2002: (OCT, 15), + 2003: (OCT, 5), + 2004: (OCT, 22), + 2005: (OCT, 12), + 2006: (OCT, 2), + 2007: (OCT, 21), + 2008: (OCT, 9), + 2009: (SEP, 28), + 2010: (OCT, 17), + 2011: (OCT, 6), + 2012: (OCT, 24), + 2013: (OCT, 13), + 2014: (OCT, 3), + 2015: (OCT, 22), + 2016: (OCT, 11), + 2017: (SEP, 30), + 2018: (OCT, 19), + 2019: (OCT, 8), + 2020: (OCT, 25), + 2021: (OCT, 15), + 2022: (OCT, 5), + 2023: (OCT, 24), + 2024: (OCT, 12), + 2025: (OCT, 2), + 2026: (OCT, 20), + 2027: (OCT, 9), + 2028: (SEP, 27), + 2029: (OCT, 16), + 2030: (OCT, 6), + 2031: (OCT, 25), + 2032: (OCT, 14), + 2033: (OCT, 3), + 2034: (OCT, 22), + 2035: (OCT, 11), + } + + # https://www.timeanddate.com/holidays/india/guru-nanak-jayanti + guru_nanak_jayanti_dates = { + 2001: (NOV, 30), + 2002: (NOV, 19), + 2003: (NOV, 8), + 2004: (NOV, 26), + 2005: (NOV, 15), + 2006: (NOV, 5), + 2007: (NOV, 24), + 2008: (NOV, 13), + 2009: (NOV, 2), + 2010: (NOV, 21), + 2011: (NOV, 10), + 2012: (NOV, 28), + 2013: (NOV, 17), + 2014: (NOV, 6), + 2015: (NOV, 25), + 2016: (NOV, 14), + 2017: (NOV, 4), + 2018: (NOV, 23), + 2019: (NOV, 12), + 2020: (NOV, 30), + 2021: (NOV, 19), + 2022: (NOV, 8), + 2023: (NOV, 27), + 2024: (NOV, 15), + 2025: (NOV, 5), + 2027: (NOV, 14), + 2028: (NOV, 2), + 2029: (NOV, 21), + 2030: (NOV, 10), + 2031: (NOV, 28), + 2032: (NOV, 17), + 2033: (NOV, 6), + 2034: (NOV, 25), + 2035: (NOV, 15), + } + + # https://www.timeanddate.com/holidays/india/mahavir-jayanti + mahavir_jayanti_dates = { + 2001: (APR, 6), + 2002: (APR, 25), + 2003: (APR, 15), + 2004: (APR, 3), + 2005: (APR, 22), + 2006: (APR, 11), + 2007: (MAR, 31), + 2008: (APR, 18), + 2009: (APR, 7), + 2010: (APR, 28), + 2011: (APR, 16), + 2012: (APR, 5), + 2013: (APR, 24), + 2014: (APR, 13), + 2015: (APR, 2), + 2016: (APR, 20), + 2017: (APR, 9), + 2018: (MAR, 29), + 2019: (APR, 17), + 2020: (APR, 6), + 2021: (APR, 25), + 2022: (APR, 14), + 2023: (APR, 4), + 2024: (APR, 21), + 2025: (APR, 10), + 2026: (MAR, 31), + 2027: (APR, 18), + 2028: (APR, 7), + 2029: (APR, 26), + 2030: (APR, 16), + 2031: (APR, 5), + 2032: (APR, 23), + 2033: (APR, 12), + 2034: (APR, 1), + 2035: (APR, 20), + } + + # https://www.timeanddate.com/holidays/india/maha-shivaratri-shivaratri + maha_shivaratri_dates = { + 2001: (FEB, 21), + 2002: (MAR, 12), + 2003: (MAR, 1), + 2004: (FEB, 18), + 2005: (MAR, 8), + 2006: (FEB, 26), + 2007: (FEB, 16), + 2008: (MAR, 6), + 2009: (FEB, 23), + 2010: (FEB, 12), + 2011: (MAR, 2), + 2012: (FEB, 20), + 2013: (MAR, 10), + 2014: (FEB, 27), + 2015: (FEB, 17), + 2016: (MAR, 7), + 2017: (FEB, 24), + 2018: (FEB, 13), + 2019: (MAR, 4), + 2020: (FEB, 21), + 2021: (MAR, 11), + 2022: (MAR, 1), + 2023: (FEB, 18), + 2024: (MAR, 8), + 2025: (FEB, 26), + 2026: (FEB, 15), + 2027: (MAR, 6), + 2028: (FEB, 23), + 2029: (FEB, 11), + 2030: (MAR, 2), + 2031: (FEB, 20), + 2032: (MAR, 10), + 2033: (FEB, 27), + 2034: (FEB, 17), + 2035: (MAR, 8), + } + + # https://www.timeanddate.com/holidays/india/navratri + sharad_navratri_dates = { + 2001: (OCT, 17), + 2002: (OCT, 7), + 2003: (SEP, 26), + 2004: (OCT, 14), + 2005: (OCT, 4), + 2006: (SEP, 23), + 2007: (OCT, 12), + 2008: (SEP, 30), + 2009: (SEP, 19), + 2010: (OCT, 8), + 2011: (SEP, 28), + 2012: (OCT, 16), + 2013: (OCT, 5), + 2014: (SEP, 25), + 2015: (OCT, 13), + 2016: (OCT, 1), + 2017: (SEP, 21), + 2018: (OCT, 10), + 2019: (SEP, 29), + 2020: (OCT, 17), + 2021: (OCT, 7), + 2022: (SEP, 26), + 2023: (OCT, 15), + 2024: (OCT, 3), + 2025: (SEP, 22), + 2026: (OCT, 11), + 2027: (SEP, 30), + 2028: (SEP, 19), + 2029: (OCT, 8), + 2030: (SEP, 28), + 2031: (OCT, 17), + 2032: (OCT, 5), + 2033: (SEP, 24), + 2034: (OCT, 13), + 2035: (OCT, 2), + } + + # https://www.timeanddate.com/holidays/india/ganesh-chaturthi + ganesh_chaturthi_dates = { + 2001: (AUG, 22), + 2002: (SEP, 10), + 2003: (AUG, 31), + 2004: (SEP, 18), + 2005: (SEP, 7), + 2006: (AUG, 27), + 2007: (SEP, 15), + 2008: (SEP, 3), + 2009: (AUG, 23), + 2010: (SEP, 11), + 2011: (SEP, 1), + 2012: (SEP, 19), + 2013: (SEP, 9), + 2014: (AUG, 29), + 2015: (SEP, 17), + 2016: (SEP, 5), + 2017: (AUG, 25), + 2018: (SEP, 13), + 2019: (SEP, 2), + 2020: (AUG, 22), + 2021: (SEP, 10), + 2022: (AUG, 31), + 2023: (SEP, 19), + 2024: (SEP, 7), + 2025: (AUG, 27), + 2026: (SEP, 14), + 2027: (SEP, 4), + 2028: (AUG, 23), + 2029: (SEP, 11), + 2030: (SEP, 1), + 2031: (SEP, 20), + 2032: (SEP, 8), + 2033: (AUG, 28), + 2034: (SEP, 16), + 2035: (SEP, 5), } if self._year in diwali_dates: @@ -176,6 +554,30 @@ def _populate_public_holidays(self): if self._year in holi_dates: self._add_holiday("Holi", holi_dates[self._year]) + if self._year in rakhi_dates: + self._add_holiday("Raksha Bandhan", rakhi_dates[self._year]) + + if self._year in janmashtami_dates: + self._add_holiday("Janmashtami", janmashtami_dates[self._year]) + + if self._year in dussehra_dates: + self._add_holiday("Dussehra", dussehra_dates[self._year]) + + if self._year in guru_nanak_jayanti_dates: + self._add_holiday("Guru Nanak Jayanti", guru_nanak_jayanti_dates[self._year]) + + if self._year in mahavir_jayanti_dates: + self._add_holiday("Mahavir Jayanti", mahavir_jayanti_dates[self._year]) + + if self._year in maha_shivaratri_dates: + self._add_holiday("Maha Shivaratri", maha_shivaratri_dates[self._year]) + + if self._year in sharad_navratri_dates: + self._add_holiday("Navratri / Sharad Navratri", sharad_navratri_dates[self._year]) + + if self._year in ganesh_chaturthi_dates: + self._add_holiday("Ganesh Chaturthi", ganesh_chaturthi_dates[self._year]) + # Islamic holidays. # Day of Ashura. self._add_ashura_day("Day of Ashura") @@ -203,6 +605,105 @@ def _populate_public_holidays(self): if self.subdiv == "OR": self._populate_subdiv_od_public_holidays() + def _add_chhath_puja(self): + # Adds Chhath Puja if the year exists in the predefined dates. + # # https://www.timeanddate.com/holidays/india/chhat-puja + chhath_puja_dates = { + 2001: (NOV, 21), + 2002: (NOV, 10), + 2003: (OCT, 30), + 2004: (NOV, 17), + 2005: (NOV, 7), + 2006: (OCT, 28), + 2007: (NOV, 16), + 2008: (NOV, 4), + 2009: (OCT, 24), + 2010: (NOV, 11), + 2011: (NOV, 1), + 2012: (NOV, 19), + 2013: (NOV, 8), + 2014: (OCT, 29), + 2015: (NOV, 17), + 2016: (NOV, 6), + 2017: (OCT, 26), + 2018: (NOV, 13), + 2019: (NOV, 2), + 2020: (NOV, 20), + 2021: (NOV, 10), + 2022: (OCT, 30), + 2023: (NOV, 19), + 2024: (NOV, 7), + 2025: (OCT, 28), + 2026: (NOV, 15), + 2027: (NOV, 4), + 2028: (OCT, 23), + 2029: (NOV, 11), + 2030: (NOV, 1), + 2031: (NOV, 20), + 2032: (NOV, 9), + 2033: (OCT, 29), + 2034: (NOV, 17), + 2035: (NOV, 6), + } + if self._year in chhath_puja_dates: + self._add_holiday("Chhath Puja", chhath_puja_dates[self._year]) + + def _add_makar_sankranti(self): + # Adds Makar Sankranti with a state-specific name. + # https://www.timeanddate.com/holidays/india/makar-sankranti + makar_sankranti_dates = { + 2001: (JAN, 14), + 2002: (JAN, 14), + 2003: (JAN, 14), + 2004: (JAN, 15), + 2005: (JAN, 14), + 2006: (JAN, 14), + 2007: (JAN, 15), + 2008: (JAN, 15), + 2009: (JAN, 14), + 2010: (JAN, 14), + 2011: (JAN, 15), + 2012: (JAN, 15), + 2013: (JAN, 14), + 2014: (JAN, 14), + 2015: (JAN, 15), + 2016: (JAN, 15), + 2017: (JAN, 14), + 2018: (JAN, 14), + 2019: (JAN, 15), + 2020: (JAN, 15), + 2021: (JAN, 14), + 2022: (JAN, 14), + 2023: (JAN, 14), + 2024: (JAN, 14), + 2025: (JAN, 14), + 2026: (JAN, 14), + 2027: (JAN, 15), + 2028: (JAN, 15), + 2029: (JAN, 14), + 2030: (JAN, 14), + 2031: (JAN, 15), + 2032: (JAN, 15), + 2033: (JAN, 14), + 2034: (JAN, 14), + 2035: (JAN, 15), + } + + holiday_names = { + "TN": "Pongal", # Tamil Nadu + "GJ": "Uttarayan", # Gujarat + "AS": "Bihu", # Assam + } + + if self._year in makar_sankranti_dates: + state = self.subdiv # Get the state + name = holiday_names.get(state, "Makar Sankranti") # Default to "Makar Sankranti" + self._add_holiday(name, makar_sankranti_dates[self._year]) + + # Andaman and Nicobar Islands. + def _populate_subdiv_an_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + # Andhra Pradesh. def _populate_subdiv_ap_public_holidays(self): self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") @@ -210,64 +711,244 @@ def _populate_subdiv_ap_public_holidays(self): # Assam. def _populate_subdiv_as_public_holidays(self): - self._add_holiday_apr_15("Bihu (Assamese New Year)") + self._add_makar_sankranti() + self._add_holiday_dec_2("Asssam Day") # Bihar. def _populate_subdiv_br_public_holidays(self): - self._add_holiday_mar_22("Bihar Day") + self._add_chhath_puja() self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + self._add_holiday_mar_22("Bihar Day") # Chhattisgarh. def _populate_subdiv_cg_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_nov_1("Chhattisgarh Foundation Day") + # Chandigarh. + def _populate_subdiv_ch_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + + # Delhi. + def _populate_subdiv_dl_public_holidays(self): + self._add_chhath_puja() + + # Goa. + def _populate_subdiv_ga_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + self._add_holiday_dec_19("Goa Liberation Day") + # Gujarat. def _populate_subdiv_gj_public_holidays(self): - self._add_holiday_jan_14("Uttarayan") + self._add_makar_sankranti() + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_may_1("Gujarat Day") - self._add_holiday_oct_31("Sardar Patel Jayanti") + self._add_holiday_oct_31("Sardar Vallabhbhai Patel Jayanti") + + # Himachal Pradesh. + def _populate_subdiv_hp_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + self._add_holiday_apr_15("Haryana Day") # Haryana. def _populate_subdiv_hr_public_holidays(self): self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_nov_1("Haryana Foundation Day") + # Jammu and Kashmir + def _populate_subdiv_jk_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + + # Jharkhand. + def _populate_subdiv_jh_public_holidays(self): + self._add_chhath_puja() + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + # Karnataka. def _populate_subdiv_ka_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_nov_1("Karnataka Rajyotsava") + # Ladakh. + def _populate_subdiv_la_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + # Kerala. def _populate_subdiv_kl_public_holidays(self): self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_nov_1("Kerala Foundation Day") + # Mizoram. + def _populate_subdiv_mz_public_holidays(self): + self._add_holiday_feb_20("Mizoram State Day") + # Maharashtra. def _populate_subdiv_mh_public_holidays(self): + # https://www.timeanddate.com/holidays/india/gudi-padwa + gudi_padwa_dates = { + 2001: (MAR, 26), + 2002: (APR, 13), + 2003: (APR, 2), + 2004: (MAR, 21), + 2005: (APR, 9), + 2006: (MAR, 30), + 2007: (MAR, 19), + 2008: (APR, 6), + 2009: (MAR, 27), + 2010: (MAR, 16), + 2011: (APR, 4), + 2012: (MAR, 23), + 2013: (APR, 11), + 2014: (MAR, 31), + 2015: (MAR, 21), + 2016: (APR, 8), + 2017: (MAR, 28), + 2018: (MAR, 18), + 2019: (APR, 6), + 2020: (MAR, 25), + 2021: (APR, 13), + 2022: (APR, 2), + 2023: (MAR, 22), + 2024: (APR, 9), + 2025: (MAR, 30), + 2026: (MAR, 19), + 2027: (APR, 7), + 2028: (MAR, 27), + 2029: (APR, 14), + 2030: (APR, 3), + 2031: (MAR, 24), + 2032: (APR, 11), + 2033: (MAR, 31), + 2034: (MAR, 21), + 2035: (APR, 9), + } + if self._year in gudi_padwa_dates: + self._add_holiday("Gudi Padwa", gudi_padwa_dates[self._year]) + + self._add_holiday_feb_19("Chhatrapati Shivaji Maharaj Jayanti") self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_may_1("Maharashtra Day") self._add_holiday_oct_15("Dussehra") # Madhya Pradesh. def _populate_subdiv_mp_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_nov_1("Madhya Pradesh Foundation Day") + # Nagaland. + def _populate_subdiv_nl_public_holidays(self): + self._add_holiday_dec_1("Nagaland State Inauguration Day") + # Orissa / Odisha. def _populate_subdiv_od_public_holidays(self): self._add_holiday_apr_1("Odisha Day (Utkala Dibasa)") self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_apr_15("Maha Vishuva Sankranti / Pana Sankranti") + # Punjab. + def _populate_subdiv_pb_public_holidays(self): + # https://www.timeanddate.com/holidays/india/guru-govind-singh-jayanti + gobind_singh_jayanti_dates = { + 2001: (JAN, 2), + 2002: (JAN, 21), + 2003: (DEC, 29), + 2004: (NOV, 20), + 2005: (JAN, 5), + 2006: (JAN, 5), + 2007: (JAN, 5), + 2008: (JAN, 5), + 2009: (JAN, 5), + 2010: (JAN, 5), + 2011: (JAN, 5), + 2012: (JAN, 5), + 2013: (JAN, 18), + 2014: (JAN, 7), + 2015: (JAN, 5), + 2016: (JAN, 16), + 2017: (JAN, 5), + 2019: (JAN, 13), + 2020: (JAN, 2), + 2021: (JAN, 20), + 2022: (JAN, 9), + 2024: (JAN, 17), + 2025: (JAN, 6), + 2026: (JAN, 20), + 2027: (JAN, 15), + 2028: (JAN, 4), + 2029: (JAN, 15), + 2030: (JAN, 10), + 2032: (JAN, 18), + 2033: (JAN, 7), + 2034: (JAN, 17), + 2035: (JAN, 16), + } + if self._year in gobind_singh_jayanti_dates: + self._add_holiday("Guru Gobind Singh Jayanti", gobind_singh_jayanti_dates[self._year]) + + # https://www.timeanddate.com/holidays/india/vaisakhi + vaisakhi_dates = { + 2001: (APR, 13), + 2002: (APR, 14), + 2003: (APR, 14), + 2004: (APR, 13), + 2005: (APR, 14), + 2006: (APR, 14), + 2007: (APR, 14), + 2008: (APR, 13), + 2009: (APR, 14), + 2010: (APR, 14), + 2011: (APR, 14), + 2012: (APR, 13), + 2013: (APR, 13), + 2014: (APR, 14), + 2015: (APR, 14), + 2016: (APR, 13), + 2017: (APR, 14), + 2018: (APR, 14), + 2019: (APR, 14), + 2020: (APR, 13), + 2021: (APR, 14), + 2022: (APR, 14), + 2023: (APR, 14), + 2024: (APR, 13), + 2025: (APR, 13), + 2026: (APR, 14), + 2027: (APR, 14), + 2028: (APR, 13), + 2029: (APR, 14), + 2030: (APR, 14), + 2031: (APR, 14), + 2032: (APR, 13), + 2033: (APR, 14), + 2034: (APR, 14), + 2035: (APR, 14), + } + if self._year in vaisakhi_dates: + self._add_holiday("Vaisakhi", vaisakhi_dates[self._year]) + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + self._add_holiday_jan_13("Lohri") + self._add_holiday_nov_1("Punjab Day") + + # Puducherry. + def _populate_subdiv_py_public_holidays(self): + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + self._add_holiday_aug_16("Puducherry De Jure Transfer Day") + self._add_holiday_nov_1("Puducherry Liberation Day") + # Rajasthan. def _populate_subdiv_rj_public_holidays(self): self._add_holiday_mar_30("Rajasthan Day") + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_jun_15("Maharana Pratap Jayanti") # Sikkim. def _populate_subdiv_sk_public_holidays(self): - self._add_holiday_may_16("Annexation Day") + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + self._add_holiday_may_16("Sikkim State Day") # Tamil Nadu. def _populate_subdiv_tn_public_holidays(self): + self._add_makar_sankranti() self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_apr_14("Puthandu (Tamil New Year)") self._add_holiday_apr_15("Puthandu (Tamil New Year)") @@ -275,6 +956,8 @@ def _populate_subdiv_tn_public_holidays(self): # Telangana. def _populate_subdiv_ts_public_holidays(self): self._add_holiday_apr_6("Eid al-Fitr") + self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") + self._add_holiday_jun_2("Telangana Formation Day") self._add_holiday_oct_6("Bathukamma Festival") # Uttarakhand. @@ -283,6 +966,7 @@ def _populate_subdiv_uk_public_holidays(self): # Uttar Pradesh. def _populate_subdiv_up_public_holidays(self): + self._add_chhath_puja() self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") # West Bengal. @@ -290,6 +974,7 @@ def _populate_subdiv_wb_public_holidays(self): self._add_holiday_apr_14("Dr. B. R. Ambedkar's Jayanti") self._add_holiday_apr_14("Pohela Boishakh") self._add_holiday_apr_15("Pohela Boishakh") + self._add_holiday_may_1("May Day") self._add_holiday_may_9("Rabindra Jayanti") diff --git a/tests/countries/test_india.py b/tests/countries/test_india.py index 086b7d43b..b67b0ed7c 100644 --- a/tests/countries/test_india.py +++ b/tests/countries/test_india.py @@ -34,7 +34,6 @@ def test_subdiv_deprecation(self): def test_2018(self): self.assertHoliday( - "2018-01-14", "2018-01-26", "2018-03-02", "2018-03-25", @@ -51,108 +50,319 @@ def test_2018(self): "2018-10-02", "2018-10-02", "2018-11-07", + "2018-11-14", "2018-11-20", "2018-12-25", ) subdiv_holidays_mapping = { - "AN": ("2018-08-15",), - "AP": ("2018-11-01",), + "AN": ( + "2018-08-15", + "2018-04-14", + ), + "AP": ( + "2018-04-14", + "2018-11-01", + ), "AR": ("2018-08-15",), - "AS": ("2018-04-15",), - "BR": ("2018-03-22", "2018-04-14"), - "CG": ("2018-11-01",), - "CH": ("2018-08-15",), + "AS": ("2018-12-02"), + "BR": ( + "2018-04-14", + "2018-03-22", + ), + "CG": ( + "2018-11-01", + "2018-04-14", + ), + "CH": ( + "2018-08-15", + "2018-04-14", + ), "DH": ("2018-08-15",), "DL": ("2018-08-15",), - "GA": ("2018-08-15",), - "GJ": ("2018-01-14", "2018-05-01", "2018-08-15", "2018-10-31"), - "HP": ("2018-08-15",), + "GA": ( + "2018-04-14", + "2018-08-15", + "2018-12-19", + ), + "GJ": ("2018-01-14", "2018-04-14", "2018-05-01", "2018-08-15", "2018-10-31"), + "HP": ( + "2018-08-15", + "2018-04-14", + ), "HR": ("2018-04-14", "2018-11-01"), "JK": ("2018-08-15",), - "JH": ("2018-08-15",), - "KA": ("2018-11-01",), + "JH": ( + "2018-08-15", + "2018-04-14", + ), + "KA": ( + "2018-11-01", + "2018-04-14", + ), "KL": ("2018-04-14", "2018-11-01"), - "LA": ("2018-08-15",), + "LA": ( + "2018-08-15", + "2018-04-14", + ), "LD": ("2018-08-15",), - "MH": ("2018-04-14", "2018-05-01", "2018-10-15"), + "MH": ("2018-04-14", "2018-05-01", "2018-10-15", "2018-02-19"), "ML": ("2018-08-15",), "MN": ("2018-08-15",), - "MP": ("2018-11-01",), - "MZ": ("2018-08-15",), - "NL": ("2018-08-15",), - "OD": ("2018-04-01", "2018-04-14", "2018-08-15"), - "PB": ("2018-08-15",), - "PY": ("2018-08-15",), - "RJ": ("2018-03-30", "2018-06-15"), - "SK": ("2018-05-16",), - "TN": ("2018-04-14", "2018-04-15", "2018-08-15"), + "MP": ( + "2018-04-14", + "2018-11-01", + ), + "MZ": ("2018-08-15", "2018-02-20"), + "NL": ("2018-08-15", "2018-12-01"), + "OD": ( + "2018-04-01", + "2018-04-14", + "2018-08-15", + ), + "PB": ( + "2018-08-15", + "2018-04-14", + "2018-01-13", + "2018-11-01", + ), + "PY": ( + "2018-04-14", + "2018-08-15", + "2018-08-16", + "2018-11-01", + ), + "RJ": ( + "2018-03-30", + "2018-04-14", + "2018-06-15", + ), + "SK": ( + "2018-04-14", + "2018-05-16", + ), + "TN": ( + "2018-04-14", + "2018-08-15", + ), "TR": ("2018-08-15",), - "TS": ("2018-04-06", "2018-10-06"), + "TS": ( + "2018-04-06", + "2018-04-14", + "2018-10-06", + "2018-06-02", + ), "UK": ("2018-04-14",), "UP": ("2018-04-14",), - "WB": ("2018-04-14", "2018-04-15", "2018-05-09"), + "WB": ( + "2018-04-14", + "2018-05-09", + "2018-05-01", + ), } for subdiv, holidays in subdiv_holidays_mapping.items(): self.assertHoliday(India(subdiv=subdiv), holidays) - def test_diwali_and_holi(self): + def test_ranged_holidays(self): warnings.simplefilter("always") - for year in (2000, 2031): # Diwali and Holi out of range. + for year in (2000, 2036): # Holidays out of range. with self.assertWarns(Warning): India(years=year) dt = ( + "2001-11-14", "2010-11-05", - "2011-10-26", - "2012-11-13", - "2013-11-03", - "2014-10-23", - "2015-11-11", - "2016-10-30", - "2017-10-19", - "2018-11-07", - "2019-10-27", - "2020-11-14", - "2021-11-04", - "2022-10-24", - "2023-11-12", - "2024-11-01", "2025-10-20", - "2026-11-08", - "2027-10-29", - "2028-10-17", - "2029-11-05", - "2030-10-26", + "2035-10-30", ) self.assertHolidayName("Diwali", dt) dt = ( + "2001-03-10", "2010-03-01", - "2011-03-20", - "2012-03-08", - "2013-03-27", - "2014-03-17", - "2015-03-06", - "2016-03-24", - "2017-03-13", - "2018-03-02", - "2019-03-21", - "2020-03-10", - "2021-03-29", - "2022-03-18", - "2023-03-08", - "2024-03-25", "2025-03-14", - "2026-03-04", - "2027-03-22", - "2028-03-11", - "2029-03-01", - "2030-03-20", + "2035-03-24", ) self.assertHolidayName("Holi", dt) + dt = ( + "2001-08-12", + "2010-09-02", + "2025-08-16", + "2035-08-26", + ) + self.assertHolidayName("Janmashtami", dt) + + dt = ( + "2001-08-04", + "2010-08-24", + "2025-08-09", + "2035-08-18", + ) + self.assertHolidayName("Raksha Bandhan", dt) + + dt = ( + "2001-10-26", + "2010-10-17", + "2025-10-02", + "2035-10-11", + ) + self.assertHolidayName("Dussehra", dt) + + dt = ( + "2001-11-30", + "2010-11-21", + "2025-11-05", + "2035-11-15", + ) + self.assertHolidayName("Guru Nanak Jayanti", dt) + + dt = ( + "2001-04-06", + "2010-04-28", + "2025-04-10", + "2035-04-20", + ) + self.assertHolidayName("Mahavir Jayanti", dt) + + dt = ( + "2001-02-21", + "2010-02-12", + "2025-02-26", + "2035-03-08", + ) + self.assertHolidayName("Maha Shivaratri", dt) + + dt = ( + "2001-01-14", + "2010-01-14", + "2025-01-14", + "2035-01-15", + ) + self.assertHolidayName("Makar Sankranti", dt) + + dt = ( + "2001-10-17", + "2010-10-08", + "2025-09-22", + "2035-10-02", + ) + self.assertHolidayName("Navratri / Sharad Navratri", dt) + + dt = ( + "2001-08-22", + "2010-09-11", + "2025-08-27", + "2035-09-05", + ) + self.assertHolidayName("Ganesh Chaturthi", dt) + + def test_ranged_subdiv_holidays(self): + warnings.simplefilter("always") + + # Test out of range dates for Bihar + for year in (2000, 2036): + with self.assertWarns(Warning): + India(subdiv="BR", years=year) + dt = ( + "2001-11-21", + "2010-11-11", + "2025-10-28", + "2035-11-06", + ) + self.assertHolidayName("Chhath Puja", India(subdiv="BR"), dt) + self.assertNoHolidayName("Chhath Puja", India(subdiv="MH"), dt) + + # Test out of range dates for Delhi + for year in (2000, 2036): + with self.assertWarns(Warning): + India(subdiv="DL", years=year) + dt = ( + "2001-11-21", + "2010-11-11", + "2025-10-28", + "2035-11-06", + ) + self.assertHolidayName("Chhath Puja", India(subdiv="DL"), dt) + self.assertNoHolidayName("Chhath Puja", India(subdiv="MH"), dt) + + # Test out of range dates for Jharkhand + for year in (2000, 2036): + with self.assertWarns(Warning): + India(subdiv="JH", years=year) + dt = ( + "2001-11-21", + "2010-11-11", + "2025-10-28", + "2035-11-06", + ) + self.assertHolidayName("Chhath Puja", India(subdiv="JH"), dt) + self.assertNoHolidayName("Chhath Puja", India(subdiv="MH"), dt) + + # Test out of range dates for Maharashtra + for year in (2000, 2036): + with self.assertWarns(Warning): + India(subdiv="MH", years=year) + + dt = ( + "2001-03-26", + "2010-03-16", + "2025-03-30", + "2035-04-09", + ) + self.assertHolidayName("Gudi Padwa", India(subdiv="MH"), dt) + self.assertNoHolidayName("Gudi Padwa", India(subdiv="DL"), dt) + + # Test out of range dates for Punjab + for year in (2000, 2036): + with self.assertWarns(Warning): + India(subdiv="PB", years=year) + + dt = ( + "2001-01-02", + "2010-01-05", + "2025-01-06", + "2035-01-16", + ) + self.assertHolidayName("Guru Gobind Singh Jayanti", India(subdiv="PB"), dt) + self.assertNoHolidayName("Guru Gobind Singh Jayanti", India(subdiv="DL"), dt) + + dt = ( + "2001-04-13", + "2010-04-14", + "2025-04-13", + "2035-04-14", + ) + self.assertHolidayName("Vaisakhi", India(subdiv="PB"), dt) + self.assertNoHolidayName("Vaisakhi", India(subdiv="DL"), dt) + + # Test out of range dates for Uttar Pradesh + for year in (2000, 2036): + with self.assertWarns(Warning): + India(subdiv="UP", years=year) + dt = ( + "2001-11-21", + "2010-11-11", + "2025-10-28", + "2035-11-06", + ) + self.assertHolidayName("Chhath Puja", India(subdiv="UP"), dt) + self.assertNoHolidayName("Chhath Puja", India(subdiv="MH"), dt) + + # Test out of range dates for Tamil Nadu + for year in (2000, 2036): + with self.assertWarns(Warning): + India(subdiv="TN", years=year) + dt = ( + "2001-01-14", + "2010-01-14", + "2025-01-14", + "2035-01-15", + ) + self.assertHolidayName("Pongal", India(subdiv="TN"), dt) + self.assertNoHolidayName("Chhath Puja", India(subdiv="MH"), dt) + def test_pre_1947(self): self.assertNoHoliday("1946-08-15")