holidays 0.81__py3-none-any.whl → 0.83__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. holidays/calendars/__init__.py +1 -0
  2. holidays/calendars/burmese.py +319 -0
  3. holidays/calendars/hebrew.py +2 -2
  4. holidays/calendars/islamic.py +26 -6
  5. holidays/calendars/thai.py +49 -2
  6. holidays/countries/__init__.py +11 -0
  7. holidays/countries/afghanistan.py +7 -5
  8. holidays/countries/algeria.py +89 -24
  9. holidays/countries/antarctica.py +58 -0
  10. holidays/countries/azerbaijan.py +1 -1
  11. holidays/countries/bouvet_island.py +31 -0
  12. holidays/countries/brazil.py +1 -1
  13. holidays/countries/british_indian_ocean_territory.py +31 -0
  14. holidays/countries/bulgaria.py +6 -1
  15. holidays/countries/canada.py +27 -13
  16. holidays/countries/chile.py +9 -8
  17. holidays/countries/cuba.py +3 -4
  18. holidays/countries/denmark.py +18 -6
  19. holidays/countries/djibouti.py +1 -1
  20. holidays/countries/fiji.py +2 -3
  21. holidays/countries/finland.py +3 -6
  22. holidays/countries/guyana.py +24 -32
  23. holidays/countries/heard_island_and_mcdonald_islands.py +31 -0
  24. holidays/countries/hungary.py +4 -5
  25. holidays/countries/india.py +27 -78
  26. holidays/countries/iran.py +133 -269
  27. holidays/countries/ireland.py +1 -1
  28. holidays/countries/israel.py +1 -1
  29. holidays/countries/japan.py +22 -18
  30. holidays/countries/jordan.py +6 -3
  31. holidays/countries/kuwait.py +6 -3
  32. holidays/countries/macau.py +5 -8
  33. holidays/countries/malaysia.py +14 -3
  34. holidays/countries/mauritius.py +10 -9
  35. holidays/countries/montserrat.py +1 -1
  36. holidays/countries/myanmar.py +194 -0
  37. holidays/countries/nepal.py +11 -30
  38. holidays/countries/netherlands.py +28 -24
  39. holidays/countries/new_zealand.py +75 -31
  40. holidays/countries/nigeria.py +53 -75
  41. holidays/countries/north_korea.py +161 -0
  42. holidays/countries/norway.py +24 -9
  43. holidays/countries/oman.py +6 -2
  44. holidays/countries/paraguay.py +70 -23
  45. holidays/countries/portugal.py +5 -6
  46. holidays/countries/qatar.py +5 -2
  47. holidays/countries/rwanda.py +8 -3
  48. holidays/countries/saudi_arabia.py +6 -5
  49. holidays/countries/serbia.py +5 -0
  50. holidays/countries/slovakia.py +23 -4
  51. holidays/countries/south_africa.py +96 -53
  52. holidays/countries/south_korea.py +6 -1
  53. holidays/countries/spain.py +4 -4
  54. holidays/countries/sri_lanka.py +21 -58
  55. holidays/countries/sudan.py +6 -3
  56. holidays/countries/suriname.py +1 -2
  57. holidays/countries/sweden.py +1 -1
  58. holidays/countries/switzerland.py +255 -6
  59. holidays/countries/taiwan.py +23 -3
  60. holidays/countries/tanzania.py +25 -30
  61. holidays/countries/thailand.py +29 -7
  62. holidays/countries/tonga.py +6 -1
  63. holidays/countries/trinidad_and_tobago.py +7 -2
  64. holidays/countries/ukraine.py +1 -1
  65. holidays/countries/united_arab_emirates.py +9 -2
  66. holidays/countries/united_kingdom.py +1 -1
  67. holidays/countries/united_states.py +18 -2
  68. holidays/countries/uruguay.py +6 -1
  69. holidays/countries/vietnam.py +6 -1
  70. holidays/countries/western_sahara.py +92 -0
  71. holidays/countries/yemen.py +6 -3
  72. holidays/groups/__init__.py +1 -0
  73. holidays/groups/balinese_saka.py +1 -1
  74. holidays/groups/buddhist.py +3 -3
  75. holidays/groups/burmese.py +273 -0
  76. holidays/groups/chinese.py +30 -2
  77. holidays/groups/christian.py +10 -0
  78. holidays/groups/custom.py +8 -2
  79. holidays/groups/eastern.py +26 -0
  80. holidays/groups/hebrew.py +16 -14
  81. holidays/groups/hindu.py +23 -15
  82. holidays/groups/international.py +1 -1
  83. holidays/groups/islamic.py +52 -50
  84. holidays/groups/mongolian.py +6 -3
  85. holidays/groups/sinhala.py +9 -11
  86. holidays/groups/tibetan.py +8 -6
  87. holidays/holiday_base.py +26 -26
  88. holidays/ical.py +6 -4
  89. holidays/locale/ar/LC_MESSAGES/DZ.mo +0 -0
  90. holidays/locale/ar/LC_MESSAGES/EH.mo +0 -0
  91. holidays/locale/ca/LC_MESSAGES/ES.mo +0 -0
  92. holidays/locale/de/LC_MESSAGES/CH.mo +0 -0
  93. holidays/locale/en_IN/LC_MESSAGES/IN.mo +0 -0
  94. holidays/locale/en_US/LC_MESSAGES/BR.mo +0 -0
  95. holidays/locale/en_US/LC_MESSAGES/CH.mo +0 -0
  96. holidays/locale/en_US/LC_MESSAGES/DZ.mo +0 -0
  97. holidays/locale/en_US/LC_MESSAGES/EH.mo +0 -0
  98. holidays/locale/en_US/LC_MESSAGES/ES.mo +0 -0
  99. holidays/locale/en_US/LC_MESSAGES/IN.mo +0 -0
  100. holidays/locale/en_US/LC_MESSAGES/JP.mo +0 -0
  101. holidays/locale/en_US/LC_MESSAGES/KP.mo +0 -0
  102. holidays/locale/en_US/LC_MESSAGES/MM.mo +0 -0
  103. holidays/locale/en_US/LC_MESSAGES/NL.mo +0 -0
  104. holidays/locale/en_US/LC_MESSAGES/PY.mo +0 -0
  105. holidays/locale/en_US/LC_MESSAGES/US.mo +0 -0
  106. holidays/locale/es/LC_MESSAGES/EH.mo +0 -0
  107. holidays/locale/es/LC_MESSAGES/ES.mo +0 -0
  108. holidays/locale/es/LC_MESSAGES/PY.mo +0 -0
  109. holidays/locale/fr/LC_MESSAGES/CH.mo +0 -0
  110. holidays/locale/fr/LC_MESSAGES/DZ.mo +0 -0
  111. holidays/locale/fr/LC_MESSAGES/EH.mo +0 -0
  112. holidays/locale/fy/LC_MESSAGES/NL.mo +0 -0
  113. holidays/locale/hi/LC_MESSAGES/IN.mo +0 -0
  114. holidays/locale/it/LC_MESSAGES/CH.mo +0 -0
  115. holidays/locale/ja/LC_MESSAGES/JP.mo +0 -0
  116. holidays/locale/ko_KP/LC_MESSAGES/KP.mo +0 -0
  117. holidays/locale/my/LC_MESSAGES/MM.mo +0 -0
  118. holidays/locale/nl/LC_MESSAGES/NL.mo +0 -0
  119. holidays/locale/pt_BR/LC_MESSAGES/BR.mo +0 -0
  120. holidays/locale/th/LC_MESSAGES/CH.mo +0 -0
  121. holidays/locale/th/LC_MESSAGES/DK.mo +0 -0
  122. holidays/locale/th/LC_MESSAGES/JP.mo +0 -0
  123. holidays/locale/th/LC_MESSAGES/MM.mo +0 -0
  124. holidays/locale/th/LC_MESSAGES/NL.mo +0 -0
  125. holidays/locale/th/LC_MESSAGES/US.mo +0 -0
  126. holidays/locale/uk/LC_MESSAGES/BR.mo +0 -0
  127. holidays/locale/uk/LC_MESSAGES/CH.mo +0 -0
  128. holidays/locale/uk/LC_MESSAGES/ES.mo +0 -0
  129. holidays/locale/uk/LC_MESSAGES/NL.mo +0 -0
  130. holidays/locale/uk/LC_MESSAGES/PY.mo +0 -0
  131. holidays/no_holiday_base.py +21 -0
  132. holidays/observed_holiday_base.py +16 -4
  133. holidays/registry.py +8 -0
  134. holidays/utils.py +5 -5
  135. holidays/version.py +1 -1
  136. {holidays-0.81.dist-info → holidays-0.83.dist-info}/METADATA +63 -19
  137. {holidays-0.81.dist-info → holidays-0.83.dist-info}/RECORD +141 -118
  138. {holidays-0.81.dist-info → holidays-0.83.dist-info}/licenses/CONTRIBUTORS +2 -0
  139. {holidays-0.81.dist-info → holidays-0.83.dist-info}/WHEEL +0 -0
  140. {holidays-0.81.dist-info → holidays-0.83.dist-info}/licenses/LICENSE +0 -0
  141. {holidays-0.81.dist-info → holidays-0.83.dist-info}/top_level.txt +0 -0
@@ -11,9 +11,8 @@
11
11
  # License: MIT (see LICENSE file)
12
12
 
13
13
  from datetime import date
14
- from typing import Optional
15
14
 
16
- from holidays.calendars.gregorian import JAN, FEB, MAR, JUN, JUL, SEP, NOV, DEC, _timedelta
15
+ from holidays.calendars.gregorian import MAR, JUN, JUL, SEP, _timedelta
17
16
  from holidays.groups import ChristianHolidays, InternationalHolidays, StaticHolidays
18
17
  from holidays.observed_holiday_base import (
19
18
  ObservedHolidayBase,
@@ -27,6 +26,7 @@ class NewZealand(ObservedHolidayBase, ChristianHolidays, InternationalHolidays,
27
26
  """New Zealand holidays."""
28
27
 
29
28
  country = "NZ"
29
+ # %s (observed).
30
30
  observed_label = "%s (observed)"
31
31
  start_year = 1894
32
32
  subdivisions = (
@@ -123,9 +123,6 @@ class NewZealand(ObservedHolidayBase, ChristianHolidays, InternationalHolidays,
123
123
  kwargs.setdefault("observed_rule", SAT_SUN_TO_NEXT_MON)
124
124
  super().__init__(*args, **kwargs)
125
125
 
126
- def _get_nearest_monday(self, *args) -> Optional[date]:
127
- return self._get_observed_date(date(self._year, *args), rule=ALL_TO_NEAREST_MON)
128
-
129
126
  def _populate_public_holidays(self):
130
127
  # Bank Holidays Act 1873
131
128
  # The Employment of Females Act 1873
@@ -138,32 +135,46 @@ class NewZealand(ObservedHolidayBase, ChristianHolidays, InternationalHolidays,
138
135
  # Sovereign's Birthday Observance Act 1937, 1952
139
136
  # Holidays Act 1981, 2003
140
137
 
141
- # New Year's Day
138
+ # New Year's Day.
142
139
  self._add_observed(self._add_new_years_day("New Year's Day"), rule=SAT_SUN_TO_NEXT_MON_TUE)
143
140
  self._add_observed(
144
- self._add_new_years_day_two("Day after New Year's Day"), rule=SAT_SUN_TO_NEXT_MON_TUE
141
+ # Day after New Year's Day.
142
+ self._add_new_years_day_two("Day after New Year's Day"),
143
+ rule=SAT_SUN_TO_NEXT_MON_TUE,
145
144
  )
146
145
 
147
- # Waitangi Day
148
146
  if self._year >= 1974:
149
- name = "Waitangi Day" if self._year >= 1977 else "New Zealand Day"
150
- feb_6 = self._add_holiday_feb_6(name)
147
+ feb_6 = self._add_holiday_feb_6(
148
+ # Waitangi Day.
149
+ "Waitangi Day"
150
+ if self._year >= 1977
151
+ # New Zealand Day.
152
+ else "New Zealand Day"
153
+ )
151
154
  if self._year >= 2014:
152
155
  self._add_observed(feb_6)
153
156
 
154
- # Anzac Day
155
157
  if self._year >= 1921:
158
+ # Anzac Day.
156
159
  apr_25 = self._add_anzac_day("Anzac Day")
157
160
  if self._year >= 2014:
158
161
  self._add_observed(apr_25)
159
162
 
160
- # Easter
163
+ # Good Friday.
161
164
  self._add_good_friday("Good Friday")
165
+
166
+ # Easter Monday.
162
167
  self._add_easter_monday("Easter Monday")
163
168
 
164
169
  # Sovereign's Birthday
165
170
  if self._year >= 1902:
166
- name = "Queen's Birthday" if 1952 <= self._year <= 2022 else "King's Birthday"
171
+ name = (
172
+ # Queen's Birthday.
173
+ "Queen's Birthday"
174
+ if 1952 <= self._year <= 2022
175
+ # King's Birthday.
176
+ else "King's Birthday"
177
+ )
167
178
  if self._year == 1952:
168
179
  self._add_holiday_jun_2(name) # Elizabeth II
169
180
  elif self._year >= 1938:
@@ -213,20 +224,21 @@ class NewZealand(ObservedHolidayBase, ChristianHolidays, InternationalHolidays,
213
224
  2052: (JUN, 21),
214
225
  }
215
226
  if dt := dates_obs.get(self._year):
227
+ # Matariki.
216
228
  self._add_holiday("Matariki", dt)
217
229
 
218
- # Labour Day
219
230
  if self._year >= 1900:
231
+ # Labour Day.
220
232
  name = "Labour Day"
221
233
  if self._year >= 1910:
222
234
  self._add_holiday_4th_mon_of_oct(name)
223
235
  else:
224
236
  self._add_holiday_2nd_wed_of_oct(name)
225
237
 
226
- # Christmas Day
238
+ # Christmas Day.
227
239
  self._add_observed(self._add_christmas_day("Christmas Day"), rule=SAT_SUN_TO_NEXT_MON_TUE)
228
240
 
229
- # Boxing Day
241
+ # Boxing Day.
230
242
  self._add_observed(self._add_christmas_day_two("Boxing Day"), rule=SAT_SUN_TO_NEXT_MON_TUE)
231
243
 
232
244
  if self.subdiv == "New Plymouth":
@@ -237,59 +249,90 @@ class NewZealand(ObservedHolidayBase, ChristianHolidays, InternationalHolidays,
237
249
  self._populate_subdiv_wtc_public_holidays()
238
250
 
239
251
  def _populate_subdiv_auk_public_holidays(self):
240
- self._add_holiday("Auckland Anniversary Day", self._get_nearest_monday(JAN, 29))
252
+ self._move_holiday_forced(
253
+ # Auckland Anniversary Day.
254
+ self._add_holiday_jan_29("Auckland Anniversary Day"),
255
+ rule=ALL_TO_NEAREST_MON,
256
+ )
241
257
 
242
258
  def _populate_subdiv_can_public_holidays(self):
259
+ # Canterbury Anniversary Day.
243
260
  self._add_holiday_10_days_past_1st_tue_of_nov("Canterbury Anniversary Day")
244
261
 
245
262
  def _populate_subdiv_cit_public_holidays(self):
246
- self._add_holiday("Chatham Islands Anniversary Day", self._get_nearest_monday(NOV, 30))
263
+ self._move_holiday_forced(
264
+ # Chatham Islands Anniversary Day.
265
+ self._add_holiday_nov_30("Chatham Islands Anniversary Day"),
266
+ rule=ALL_TO_NEAREST_MON,
267
+ )
247
268
 
248
269
  def _populate_subdiv_hkb_public_holidays(self):
270
+ # Hawke's Bay Anniversary Day.
249
271
  self._add_holiday_3_days_prior_4th_mon_of_oct("Hawke's Bay Anniversary Day")
250
272
 
251
273
  def _populate_subdiv_mbh_public_holidays(self):
274
+ # Marlborough Anniversary Day.
252
275
  self._add_holiday_7_days_past_4th_mon_of_oct("Marlborough Anniversary Day")
253
276
 
254
277
  def _populate_subdiv_nsn_public_holidays(self):
255
- self._add_holiday("Nelson Anniversary Day", self._get_nearest_monday(FEB, 1))
278
+ self._move_holiday_forced(
279
+ # Nelson Anniversary Day.
280
+ self._add_holiday_feb_1("Nelson Anniversary Day"),
281
+ rule=ALL_TO_NEAREST_MON,
282
+ )
256
283
 
257
284
  def _populate_subdiv_ntl_public_holidays(self):
258
285
  if 1964 <= self._year <= 1973:
259
- self._add_holiday("Waitangi Day", self._get_nearest_monday(FEB, 6))
286
+ self._move_holiday_forced(
287
+ # Waitangi Day.
288
+ self._add_holiday_feb_6("Waitangi Day"),
289
+ rule=ALL_TO_NEAREST_MON,
290
+ )
260
291
  else:
261
- self._add_holiday("Auckland Anniversary Day", self._get_nearest_monday(JAN, 29))
292
+ self._move_holiday_forced(
293
+ # Auckland Anniversary Day.
294
+ self._add_holiday_jan_29("Auckland Anniversary Day"),
295
+ rule=ALL_TO_NEAREST_MON,
296
+ )
262
297
 
263
298
  def _populate_subdiv_ota_public_holidays(self):
264
299
  # there is no easily determined single day of local observance?!?!
265
- dt = self._get_nearest_monday(MAR, 23)
266
- if dt == _timedelta(self._easter_sunday, +1): # Avoid Easter Monday
300
+ # If Easter Monday, observed on Easter Tuesday instead.
301
+ dt = self._get_observed_date(date(self._year, MAR, 23), rule=ALL_TO_NEAREST_MON)
302
+ if dt == _timedelta(self._easter_sunday, +1):
267
303
  dt = _timedelta(dt, +1)
304
+ # Otago Anniversary Day.
268
305
  self._add_holiday("Otago Anniversary Day", dt)
269
306
 
270
307
  def _populate_subdiv_stc_public_holidays(self):
271
308
  self._add_holiday_4th_mon_of_sep("South Canterbury Anniversary Day")
272
309
 
273
310
  def _populate_subdiv_stl_public_holidays(self):
311
+ # Southland Anniversary Day.
274
312
  name = "Southland Anniversary Day"
275
313
  if self._year >= 2012:
276
314
  self._add_easter_tuesday(name)
277
315
  else:
278
- self._add_holiday(name, self._get_nearest_monday(JAN, 17))
316
+ self._move_holiday_forced(self._add_holiday_jan_17(name), rule=ALL_TO_NEAREST_MON)
279
317
 
280
318
  def _populate_subdiv_tki_public_holidays(self):
319
+ # Taranaki Anniversary Day.
281
320
  self._add_holiday_2nd_mon_of_mar("Taranaki Anniversary Day")
282
321
 
283
322
  def _populate_subdiv_wgn_public_holidays(self):
284
- self._add_holiday("Wellington Anniversary Day", self._get_nearest_monday(JAN, 22))
323
+ self._move_holiday_forced(
324
+ # Wellington Anniversary Day.
325
+ self._add_holiday_jan_22("Wellington Anniversary Day"),
326
+ rule=ALL_TO_NEAREST_MON,
327
+ )
285
328
 
286
329
  def _populate_subdiv_wtc_public_holidays(self):
287
- dt = (
288
- date(self._year, DEC, 5)
289
- if self._year == 2005 # special case?!?!
290
- else self._get_nearest_monday(DEC, 1)
291
- )
292
- self._add_holiday("West Coast Anniversary Day", dt)
330
+ # West Coast Anniversary Day.
331
+ name = "West Coast Anniversary Day"
332
+ if self._year == 2005:
333
+ self._add_holiday_dec_5(name)
334
+ else:
335
+ self._move_holiday_forced(self._add_holiday_dec_1(name), rule=ALL_TO_NEAREST_MON)
293
336
 
294
337
 
295
338
  class NZ(NewZealand):
@@ -302,5 +345,6 @@ class NZL(NewZealand):
302
345
 
303
346
  class NewZelandStaticHolidays:
304
347
  special_public_holidays = {
348
+ # Queen Elizabeth II Memorial Day.
305
349
  2022: (SEP, 26, "Queen Elizabeth II Memorial Day"),
306
350
  }
@@ -64,11 +64,17 @@ class Nigeria(
64
64
  islamic_show_estimated:
65
65
  Whether to add "estimated" label to Islamic holidays name
66
66
  if holiday date is estimated.
67
+
68
+ In Nigeria, the dates of the Islamic calendar usually fall a day later than
69
+ the corresponding dates in the Umm al-Qura calendar.
67
70
  """
68
71
  ChristianHolidays.__init__(self)
69
72
  InternationalHolidays.__init__(self)
70
73
  IslamicHolidays.__init__(
71
- self, cls=NigeriaIslamicHolidays, show_estimated=islamic_show_estimated
74
+ self,
75
+ cls=NigeriaIslamicHolidays,
76
+ show_estimated=islamic_show_estimated,
77
+ calendar_delta_days=+1,
72
78
  )
73
79
  StaticHolidays.__init__(self, NigeriaStaticHolidays)
74
80
  kwargs.setdefault("observed_rule", SAT_SUN_TO_NEXT_WORKDAY)
@@ -147,112 +153,84 @@ class NigeriaIslamicHolidays(_CustomIslamicHolidays):
147
153
  # https://web.archive.org/web/20250829051803/https://www.timeanddate.com/holidays/nigeria/id-el-kabir
148
154
  EID_AL_ADHA_DATES_CONFIRMED_YEARS = (1979, 2025)
149
155
  EID_AL_ADHA_DATES = {
150
- 1979: (NOV, 1),
151
- 1980: (OCT, 20),
152
- 1981: (OCT, 9),
153
156
  1982: (SEP, 29),
154
- 1983: (SEP, 18),
155
- 1984: (SEP, 6),
156
- 1985: (AUG, 27),
157
- 1986: (AUG, 16),
158
157
  1987: (AUG, 6),
159
158
  1988: (JUL, 25),
160
- 1989: (JUL, 14),
161
159
  1990: (JUL, 4),
162
- 1991: (JUN, 23),
163
- 1993: (JUN, 1),
164
- 1994: (MAY, 21),
165
- 1995: (MAY, 10),
160
+ 1992: (JUN, 11),
166
161
  1996: (APR, 29),
167
- 1997: (APR, 18),
168
- 1998: (APR, 8),
169
- 1999: (MAR, 28),
170
- 2001: (MAR, 6),
171
- 2002: (FEB, 23),
172
- 2003: (FEB, 12),
173
- 2004: (FEB, 2),
162
+ 2000: (MAR, 16),
163
+ 2005: (JAN, 21),
164
+ 2006: ((JAN, 10), (DEC, 31)),
174
165
  2007: (DEC, 19),
175
- 2008: (DEC, 9),
176
- 2009: (NOV, 28),
177
- 2010: (NOV, 17),
178
- 2011: (NOV, 7),
166
+ 2012: (OCT, 26),
167
+ 2013: (OCT, 15),
179
168
  2014: (OCT, 6),
180
- 2015: (SEP, 24),
181
- 2016: (SEP, 12),
182
- 2017: (SEP, 2),
183
- 2018: (AUG, 22),
184
- 2019: (AUG, 12),
169
+ 2020: (JUL, 31),
170
+ 2021: (JUL, 20),
171
+ 2022: (JUL, 9),
172
+ 2023: (JUN, 28),
173
+ 2024: (JUN, 16),
174
+ 2025: (JUN, 6),
185
175
  }
186
176
 
187
177
  # https://web.archive.org/web/20250829052410/https://www.timeanddate.com/holidays/nigeria/id-el-fitr
188
178
  EID_AL_FITR_DATES_CONFIRMED_YEARS = (1979, 2025)
189
179
  EID_AL_FITR_DATES = {
190
180
  1979: (AUG, 25),
191
- 1980: (AUG, 13),
192
- 1981: (AUG, 2),
193
181
  1982: (JUL, 23),
194
- 1983: (JUL, 12),
195
- 1985: (JUN, 20),
196
- 1986: (JUN, 9),
182
+ 1984: (JUN, 30),
197
183
  1987: (MAY, 30),
198
184
  1988: (MAY, 18),
199
- 1989: (MAY, 7),
200
- 1990: (APR, 27),
201
- 1991: (APR, 16),
202
- 1993: (MAR, 25),
203
- 1994: (MAR, 14),
204
- 1995: (MAR, 3),
185
+ 1992: (APR, 4),
205
186
  1996: (FEB, 21),
206
- 1997: (FEB, 9),
207
- 1998: (JAN, 30),
208
- 1999: (JAN, 19),
209
187
  2000: ((JAN, 8), (DEC, 28)),
210
- 2001: (DEC, 17),
211
- 2002: (DEC, 6),
212
- 2003: (NOV, 26),
213
- 2005: (NOV, 4),
214
- 2006: (OCT, 24),
188
+ 2004: (NOV, 14),
215
189
  2007: (OCT, 12),
216
190
  2008: (SEP, 29),
217
- 2009: (SEP, 21),
218
191
  2010: (SEP, 9),
219
- 2012: (AUG, 20),
220
- 2017: (JUN, 26),
192
+ 2011: (AUG, 30),
193
+ 2013: (AUG, 8),
194
+ 2014: (JUL, 28),
195
+ 2015: (JUL, 17),
196
+ 2016: (JUL, 6),
197
+ 2018: (JUN, 15),
198
+ 2019: (JUN, 4),
199
+ 2020: (MAY, 24),
200
+ 2021: (MAY, 13),
201
+ 2022: (MAY, 2),
202
+ 2023: (APR, 21),
203
+ 2024: (APR, 10),
204
+ 2025: (MAR, 30),
221
205
  }
222
206
 
223
207
  # https://web.archive.org/web/20250829053435/https://www.timeanddate.com/holidays/nigeria/id-el-maulud
224
208
  # https://web.archive.org/web/20250829054319/https://pmnewsnigeria.com/2012/02/03/fg-declares-6-feb-public-holiday/
225
209
  MAWLID_DATES_CONFIRMED_YEARS = (1979, 2025)
226
210
  MAWLID_DATES = {
227
- 1979: (FEB, 10),
228
- 1982: ((JAN, 8), (DEC, 28)),
229
- 1983: (DEC, 17),
211
+ 1980: (JAN, 30),
212
+ 1981: (JAN, 18),
230
213
  1984: (DEC, 6),
231
- 1985: (NOV, 25),
232
- 1986: (NOV, 15),
233
- 1987: (NOV, 4),
234
- 1988: (OCT, 23),
235
214
  1989: (OCT, 13),
236
- 1990: (OCT, 2),
237
- 1991: (SEP, 21),
238
- 1992: (SEP, 10),
239
- 1993: (AUG, 30),
240
- 1995: (AUG, 9),
241
- 1996: (JUL, 28),
215
+ 1994: (AUG, 19),
242
216
  1997: (JUL, 18),
243
- 1998: (JUL, 7),
244
- 2000: (JUN, 15),
245
- 2003: (MAY, 14),
246
- 2004: (MAY, 2),
247
- 2006: (APR, 11),
248
- 2011: (FEB, 16),
217
+ 1999: (JUN, 26),
218
+ 2001: (JUN, 4),
219
+ 2002: (MAY, 24),
220
+ 2005: (APR, 21),
221
+ 2007: (MAR, 31),
222
+ 2008: (MAR, 20),
223
+ 2009: (MAR, 9),
224
+ 2010: (FEB, 26),
249
225
  2012: (FEB, 6),
226
+ 2013: (JAN, 24),
227
+ 2014: (JAN, 13),
250
228
  2015: ((JAN, 2), (DEC, 24)),
251
- 2016: (DEC, 12),
252
- 2017: (DEC, 1),
253
- 2021: (OCT, 19),
254
- 2024: (SEP, 16),
255
- 2025: (SEP, 5),
229
+ 2018: (NOV, 20),
230
+ 2019: (NOV, 9),
231
+ 2020: (OCT, 29),
232
+ 2022: (OCT, 8),
233
+ 2023: (SEP, 27),
256
234
  }
257
235
 
258
236
 
@@ -0,0 +1,161 @@
1
+ # holidays
2
+ # --------
3
+ # A fast, efficient Python library for generating country, province and state
4
+ # specific sets of holidays on the fly. It aims to make determining whether a
5
+ # specific date is a holiday as fast and flexible as possible.
6
+ #
7
+ # Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
8
+ # dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
9
+ # ryanss <ryanssdev@icloud.com> (c) 2014-2017
10
+ # Website: https://github.com/vacanza/holidays
11
+ # License: MIT (see LICENSE file)
12
+
13
+ from gettext import gettext as tr
14
+
15
+ from holidays.calendars.chinese import KOREAN_CALENDAR
16
+ from holidays.groups import ChineseCalendarHolidays, InternationalHolidays
17
+ from holidays.holiday_base import HolidayBase
18
+
19
+
20
+ class NorthKorea(HolidayBase, ChineseCalendarHolidays, InternationalHolidays):
21
+ """North Korea holidays.
22
+
23
+ References:
24
+ * <https://en.wikipedia.org/wiki/Public_holidays_in_North_Korea>
25
+ * <https://en.wikipedia.org/wiki/Day_of_Songun>
26
+ * <https://en.wikipedia.org/wiki/Dano_(festival)>
27
+ * <https://en.wikipedia.org/wiki/Cold_Food_Festival>
28
+ * <https://ko.wikipedia.org/wiki/조국해방전쟁_승리_기념일>
29
+ * [2025 Holidays](https://namu.wiki/w/공휴일/북한)
30
+ * [Korean People's Army](https://web.archive.org/web/20250824194534/https://namu.wiki/w/조선인민군)
31
+ * [Founding Day of the Korean People's Revolutionary Army](https://web.archive.org/web/20250909074255/https://www.nocutnews.co.kr/news/1091995)
32
+ * [Holidays and Anniversaries](http://archive.today/2025.09.21-064344/https://unikorea.go.kr/nkhr/current/life/living/daily/?boardId=bbs_0000000000000078&mode=view&cntId=51400)
33
+ * [Day of Songun](http://archive.today/2025.09.21-063344/https://namu.wiki/w/선군절)
34
+ * [2013 North Korea Calendar](https://web.archive.org/web/20250921062305/https://nk.chosun.com/news/articleView.html?idxno=151905)
35
+ * [Daeboreum in North Korea](https://web.archive.org/web/20230210091341/https://www.newsis.com/view/?id=NISX20200207_0000911479)
36
+ * [Day of the Shining Star](https://web.archive.org/web/20250921063234/https://www.munhwa.com/article/11412228)
37
+ * [Day of the Sun](http://archive.today/2025.09.21-063705/https://namu.wiki/w/태양절)
38
+ * [Cheongmyeong Festival](https://web.archive.org/web/20250324201145/https://namu.wiki/w/청명)
39
+ """
40
+
41
+ country = "KP"
42
+ default_language = "ko_KP"
43
+ # %s (estimated).
44
+ estimated_label = tr("%s (추정된)")
45
+ start_year = 1948
46
+ supported_languages = ("en_US", "ko_KP")
47
+
48
+ def __init__(self, *args, **kwargs):
49
+ ChineseCalendarHolidays.__init__(self, calendar=KOREAN_CALENDAR)
50
+ InternationalHolidays.__init__(self)
51
+ super().__init__(*args, **kwargs)
52
+
53
+ def _populate_public_holidays(self):
54
+ # New Year's Day.
55
+ self._add_new_years_day(tr("양력설"))
56
+
57
+ if self._year <= 1967 or self._year >= 1989:
58
+ # Korean New Year.
59
+ self._add_chinese_new_years_day(tr("설명절"))
60
+
61
+ if self._year >= 2003:
62
+ # Daeboreum.
63
+ self._add_daeboreum_day(tr("대보름"))
64
+
65
+ if self._year <= 1977 or self._year >= 2018:
66
+ # Founding Day of the Korean People's Army.
67
+ self._add_holiday_feb_8(tr("조선인민군창건일"))
68
+
69
+ if self._year >= 1975:
70
+ name = (
71
+ # Day of the Shining Star.
72
+ tr("광명성절")
73
+ if self._year >= 2012
74
+ # Kim Jong Il's Birthday.
75
+ else tr("김정일의 생일")
76
+ )
77
+ self._add_holiday_feb_16(name)
78
+ if self._year >= 1986:
79
+ self._add_holiday_feb_17(name)
80
+
81
+ # International Women's Day.
82
+ self._add_womens_day(tr("국제부녀절"))
83
+
84
+ if self._year >= 2012:
85
+ # Cheongmyeong Festival.
86
+ self._add_qingming_festival(tr("청명"))
87
+
88
+ if self._year <= 1967:
89
+ # Hanshi Festival.
90
+ self._add_hanshi_festival(tr("한식"))
91
+
92
+ if self._year == 1962 or self._year >= 1968:
93
+ name = (
94
+ # Day of the Sun.
95
+ tr("태양절")
96
+ if self._year >= 1998
97
+ # Kim Il-Sung's Birthday.
98
+ else tr("김일성의 생일")
99
+ )
100
+ self._add_holiday_apr_15(name)
101
+ if self._year >= 1998:
102
+ self._add_holiday_apr_16(name)
103
+
104
+ if self._year >= 1978:
105
+ self._add_holiday_apr_25(
106
+ # Founding Day of the Korean People's Revolutionary Army.
107
+ tr("조선인민혁명군 창건일")
108
+ if self._year >= 2018
109
+ # Armed Forces Day.
110
+ else tr("건군절")
111
+ )
112
+
113
+ # International Workers' Day.
114
+ self._add_labor_day(tr("전세계근로자들의 국제적명절"))
115
+
116
+ if self._year <= 1967:
117
+ # Dano.
118
+ self._add_dragon_boat_festival(tr("단오"))
119
+
120
+ # Foundation Day of the Korean Children's Union.
121
+ self._add_holiday_jun_6(tr("조선소년단 창립절"))
122
+
123
+ if self._year >= 1996:
124
+ # Day of Victory in the Great Fatherland Liberation War.
125
+ self._add_holiday_jul_27(tr("조국해방전쟁승리기념일"))
126
+
127
+ # Liberation Day.
128
+ self._add_holiday_aug_15(tr("조국해방절"))
129
+
130
+ if self._year <= 1966 or self._year >= 1989:
131
+ # Chuseok.
132
+ self._add_mid_autumn_festival(tr("추석"))
133
+
134
+ if self._year >= 2013:
135
+ # Day of Songun.
136
+ self._add_holiday_aug_25(tr("선군절"))
137
+
138
+ # Youth Day.
139
+ self._add_holiday_aug_28(tr("청년절"))
140
+
141
+ # Founding Day of the DPRK.
142
+ self._add_holiday_sep_9(tr("조선민주주의인민공화국창건일"))
143
+
144
+ # Foundation Day of the Workers' Party of Korea.
145
+ self._add_holiday_oct_10(tr("조선로동당창건일"))
146
+
147
+ if self._year >= 2012:
148
+ # Mother's Day.
149
+ self._add_holiday_nov_16(tr("어머니날"))
150
+
151
+ if self._year >= 1972:
152
+ # Socialist Constitution Day.
153
+ self._add_holiday_dec_27(tr("사회주의헌법절"))
154
+
155
+
156
+ class KP(NorthKorea):
157
+ pass
158
+
159
+
160
+ class PRK(NorthKorea):
161
+ pass
@@ -41,13 +41,17 @@ class Norway(HolidayBase, ChristianHolidays, InternationalHolidays):
41
41
  "18", # Nordland.
42
42
  "21", # Svalbard.
43
43
  "22", # Jan Mayen.
44
- "30", # Viken.
44
+ "31", # Østfold.
45
+ "32", # Akershus.
46
+ "33", # Buskerud.
45
47
  "34", # Innlandet.
46
- "38", # Vestfold og Telemark.
48
+ "39", # Vestfold.
49
+ "40", # Telemark.
47
50
  "42", # Agder.
48
51
  "46", # Vestland.
49
52
  "50", # Trøndelag (Trööndelage).
50
- "54", # Troms og Finnmark (Romssa ja Finnmárkku, Tromssan ja Finmarkun).
53
+ "55", # Troms (Romssa, Tromssan).
54
+ "56", # Finnmark (Finnmárkku, Finmarkun).
51
55
  )
52
56
  subdivisions_aliases = {
53
57
  "Oslo": "03",
@@ -56,20 +60,31 @@ class Norway(HolidayBase, ChristianHolidays, InternationalHolidays):
56
60
  "Nordland": "18",
57
61
  "Svalbard": "21",
58
62
  "Jan Mayen": "22",
59
- "Viken": "30",
63
+ "Østfold": "31",
64
+ "Akershus": "32",
65
+ "Buskerud": "33",
60
66
  "Innlandet": "34",
61
- "Vestfold og Telemark": "38",
67
+ "Vestfold": "39",
68
+ "Telemark": "40",
62
69
  "Agder": "42",
63
70
  "Vestland": "46",
64
71
  "Trööndelage": "50",
65
72
  "Trøndelag": "50",
66
- "Romssa ja Finnmárkku": "54",
67
- "Troms og Finnmark": "54",
68
- "Tromssan ja Finmarkun": "54",
73
+ "Romssa": "55",
74
+ "Troms": "55",
75
+ "Tromssan": "55",
76
+ "Finmarkun": "56",
77
+ "Finnmark": "56",
78
+ "Finnmárkku": "56",
69
79
  }
70
80
  supported_languages = ("en_US", "no", "th", "uk")
81
+ _deprecated_subdivisions = (
82
+ "30",
83
+ "38",
84
+ "54",
85
+ )
71
86
 
72
- def __init__(self, include_sundays: bool = False, *args, **kwargs):
87
+ def __init__(self, *args, include_sundays: bool = False, **kwargs):
73
88
  """
74
89
  Args:
75
90
  include_sundays:
@@ -10,6 +10,7 @@
10
10
  # Website: https://github.com/vacanza/holidays
11
11
  # License: MIT (see LICENSE file)
12
12
 
13
+ from datetime import date
13
14
  from gettext import gettext as tr
14
15
 
15
16
  from holidays.calendars import _CustomIslamicHolidays
@@ -17,6 +18,7 @@ from holidays.calendars.gregorian import (
17
18
  FEB,
18
19
  MAR,
19
20
  APR,
21
+ MAY,
20
22
  JUN,
21
23
  JUL,
22
24
  AUG,
@@ -49,6 +51,7 @@ class Oman(HolidayBase, IslamicHolidays):
49
51
  estimated_label = tr("%s (المقدرة)")
50
52
  start_year = 1970
51
53
  supported_languages = ("ar", "en_US")
54
+ weekend = {FRI, SAT}
52
55
 
53
56
  def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
54
57
  """
@@ -62,10 +65,11 @@ class Oman(HolidayBase, IslamicHolidays):
62
65
  )
63
66
  super().__init__(*args, **kwargs)
64
67
 
65
- def _populate_public_holidays(self):
68
+ def _get_weekend(self, dt: date) -> set[int]:
66
69
  # Oman switches from THU-FRI to FRI-SAT on May 1, 2013.
67
- self.weekend = {THU, FRI} if self._year <= 2013 else {FRI, SAT}
70
+ return {FRI, SAT} if dt >= date(2013, MAY, 1) else {THU, FRI}
68
71
 
72
+ def _populate_public_holidays(self):
69
73
  if self._year >= 2020:
70
74
  # Sultan's Accession Day.
71
75
  self._add_holiday_jan_11(tr("اليوم الوطني لتولي السلطان"))