Skip to content
42 changes: 42 additions & 0 deletions holidays/calendars/hindu.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
MAHAVIR_JAYANTI = "MAHAVIR_JAYANTI"
MAKAR_SANKRANTI = "MAKAR_SANKRANTI"
ONAM = "ONAM"
PONGAL = "PONGAL"
RAKSHA_BANDHAN = "RAKSHA_BANDHAN"
RAM_NAVAMI = "RAM_NAVAMI"
SHARAD_NAVRATRI = "SHARAD_NAVRATRI"
Expand Down Expand Up @@ -865,6 +866,44 @@ class _HinduLunisolar:
2035: (SEP, 14),
}

PONGAL_DATES = {
2001: (JAN, 14),
2002: (JAN, 14),
2003: (JAN, 15),
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, 15),
2024: (JAN, 15),
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),
}

# https://www.timeanddate.com/holidays/india/raksha-bandhan
RAKSHA_BANDHAN_DATES = {
2001: (AUG, 4),
Expand Down Expand Up @@ -1270,6 +1309,9 @@ def guru_nanak_jayanti_date(self, year: int) -> tuple[Optional[date], bool]:
def holi_date(self, year: int) -> tuple[Optional[date], bool]:
return self._get_holiday(HOLI, year)

def pongal_date(self, year: int) -> tuple[Optional[date], bool]:
return self._get_holiday(PONGAL, year)

def janmashtami_date(self, year: int) -> tuple[Optional[date], bool]:
return self._get_holiday(JANMASHTAMI, year)

Expand Down
9 changes: 8 additions & 1 deletion holidays/countries/india.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ class India(
* <https://www.calendarlabs.com/holidays/india/2021>
* <https://slusi.dacnet.nic.in/watershedatlas/list_of_state_abbreviation.htm>
* <https://vahan.parivahan.gov.in/vahan4dashboard/>
* Tamil Nadu:
* [Tamil Monthly Calendar](https://www.tamildailycalendar.com/tamil_monthly_calendar.php)
* [Tamil Calendar](https://www.prokerala.com/general/calendar/tamilcalendar.php)
"""

country = "IN"
Expand Down Expand Up @@ -456,7 +459,11 @@ def _populate_subdiv_sk_public_holidays(self):
# Tamil Nadu.
def _populate_subdiv_tn_public_holidays(self):
# Pongal.
self._add_makar_sankranti(tr("Pongal"))
self._add_pongal(tr("Pongal"))
# Thiruvalluvar Day / Mattu Pongal.
self._add_thiruvalluvar_day(tr("Thiruvalluvar Day / Mattu Pongal"))
# Uzhavar Thirunal.
self._add_uzhavar_thirunal(tr("Uzhavar Thirunal"))
# Dr. B. R. Ambedkar Jayanti.
self._add_holiday_apr_14(tr("Dr. B. R. Ambedkar's Jayanti"))
# Puthandu.
Expand Down
46 changes: 44 additions & 2 deletions holidays/groups/hindu.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(self, cls=None, show_estimated=False) -> None:
self._hindu_calendar_show_estimated = show_estimated

def _add_hindu_calendar_holiday(
self, name: str, dt_estimated: tuple[Optional[date], bool]
self, name: str, dt_estimated: tuple[Optional[date], bool], days_delta: int = 0
) -> Optional[date]:
"""
Add Hindu calendar holiday.
Expand All @@ -38,7 +38,7 @@ def _add_hindu_calendar_holiday(
"""

return self._add_eastern_calendar_holiday(
name, dt_estimated, self._hindu_calendar_show_estimated
name, dt_estimated, self._hindu_calendar_show_estimated, days_delta
)

def _add_hindu_calendar_holiday_set(
Expand Down Expand Up @@ -256,6 +256,18 @@ def _add_onam(self, name) -> Optional[date]:
"""
return self._add_hindu_calendar_holiday(name, self._hindu_calendar.onam_date(self._year))

def _add_pongal(self, name) -> Optional[date]:
"""
Add Pongal.

Pongal is a major harvest festival celebrated in Tamil Nadu, India, marking the
beginning of the sun's northward journey (Uttarayana). It is usually observed
on January 14th or 15th every year, coinciding with the Tamil month of Thai.
The festival is dedicated to the Sun God and marks a season of prosperity and abundance.
https://en.wikipedia.org/wiki/Pongal_(festival)
"""
return self._add_hindu_calendar_holiday(name, self._hindu_calendar.pongal_date(self._year))

def _add_raksha_bandhan(self, name) -> Optional[date]:
"""
Add Raksha Bandhan.
Expand Down Expand Up @@ -306,6 +318,36 @@ def _add_thaipusam(self, name) -> Optional[date]:
name, self._hindu_calendar.thaipusam_date(self._year)
)

def _add_thiruvalluvar_day(self, name) -> Optional[date]:
"""
Add Thiruvalluvar Day and Mattu Pongal.

Thiruvalluvar Day and Mattu Pongal are celebrated in Tamil Nadu, India, as part
of the Pongal festival. Thiruvalluvar Day honors the classical Tamil poet and
philosopher Thiruvalluvar, while Mattu Pongal is dedicated to cattle, recognizing
their importance in agriculture. Both events usually fall on January 15th or 16th
each year during the Tamil month of Thai.
https://en.wikipedia.org/wiki/Thiruvalluvar_Day
https://en.wikipedia.org/wiki/Pongal_(festival)#Mattu_Pongal
"""
return self._add_hindu_calendar_holiday(
name, self._hindu_calendar.pongal_date(self._year), days_delta=+1
)

def _add_uzhavar_thirunal(self, name) -> Optional[date]:
"""
Add Uzhavar Thirunal.

Uzhavar Thirunal is a harvest festival celebrated in Tamil Nadu, India,
as part of the Pongal festivities. It is dedicated to honoring farmers
(uzhavar) and their contribution to agriculture. Uzhavar Thirunal usually
falls on January 16th or 17th each year.
https://en.wikipedia.org/wiki/Pongal_(festival)#Uzhavar_Thirunal
"""
return self._add_hindu_calendar_holiday(
name, self._hindu_calendar.pongal_date(self._year), days_delta=+2
)

def _add_vaisakhi(self, name) -> Optional[date]:
"""
Add Vaisakhi.
Expand Down
10 changes: 9 additions & 1 deletion holidays/locale/en_IN/LC_MESSAGES/IN.po
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Holidays 0.69\n"
"Project-Id-Version: Holidays 0.72\n"
"POT-Creation-Date: 2025-02-28 02:31+0530\n"
"PO-Revision-Date: 2025-03-01 15:11+0530\n"
"Last-Translator: Ankush Kapoor <[email protected]>\n"
Expand Down Expand Up @@ -306,3 +306,11 @@ msgstr ""
#. Buddha Purnima.
msgid "Buddha Purnima"
msgstr ""

#. Thiruvalluvar Day / Mattu Pongal.
msgid "Thiruvalluvar Day / Mattu Pongal"
msgstr ""

#. Uzhavar Thirunal.
msgid "Uzhavar Thirunal"
msgstr ""
10 changes: 9 additions & 1 deletion holidays/locale/en_US/LC_MESSAGES/IN.po
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Holidays 0.69\n"
"Project-Id-Version: Holidays 0.72\n"
"POT-Creation-Date: 2025-03-02 12:31+0530\n"
"PO-Revision-Date: 2025-03-02 12:54+0530\n"
"Last-Translator: Ankush Kapoor <[email protected]>\n"
Expand Down Expand Up @@ -307,3 +307,11 @@ msgstr "Magh Bihu"
#. Buddha Purnima.
msgid "Buddha Purnima"
msgstr "Buddha Purnima"

#. Thiruvalluvar Day / Mattu Pongal.
msgid "Thiruvalluvar Day / Mattu Pongal"
msgstr "Thiruvalluvar Day / Mattu Pongal"

#. Uzhavar Thirunal.
msgid "Uzhavar Thirunal"
msgstr "Uzhavar Thirunal"
10 changes: 9 additions & 1 deletion holidays/locale/hi/LC_MESSAGES/IN.po
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Holidays 0.69\n"
"Project-Id-Version: Holidays 0.72\n"
"POT-Creation-Date: 2025-02-28 01:24+0530\n"
"PO-Revision-Date: 2025-03-01 15:11+0530\n"
"Last-Translator: Ankush Kapoor <[email protected]>\n"
Expand Down Expand Up @@ -306,3 +306,11 @@ msgstr "माघ बिहू"
#. Buddha Purnima.
msgid "Buddha Purnima"
msgstr "बुद्ध पूर्णिमा"

#. Thiruvalluvar Day / Mattu Pongal.
msgid "Thiruvalluvar Day / Mattu Pongal"
msgstr "तिरुवल्लुवर दिवस / मट्टू पोंगल"

#. Uzhavar Thirunal.
msgid "Uzhavar Thirunal"
msgstr "उझावर थिरुनल"
34 changes: 34 additions & 0 deletions tests/countries/test_india.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,8 @@ def test_2018(self):
),
"TN": (
"2018-01-14",
"2018-01-15",
"2018-01-16",
"2018-04-14",
),
"TS": (
Expand Down Expand Up @@ -393,6 +395,32 @@ def test_ranged_subdiv_holidays(self):
else:
self.assertNoHolidayName(name, India(subdiv=subdiv), dt)

dt = (
"2001-01-15",
"2010-01-15",
"2025-01-15",
"2035-01-16",
)
name = "Thiruvalluvar Day / Mattu Pongal"
for subdiv in India.subdivisions:
if subdiv in {"TN"}:
self.assertHolidayName(name, India(subdiv=subdiv), dt)
else:
self.assertNoHolidayName(name, India(subdiv=subdiv), dt)

dt = (
"2001-01-16",
"2010-01-16",
"2025-01-16",
"2035-01-17",
)
name = "Uzhavar Thirunal"
for subdiv in India.subdivisions:
if subdiv in {"TN"}:
self.assertHolidayName(name, India(subdiv=subdiv), dt)
else:
self.assertNoHolidayName(name, India(subdiv=subdiv), dt)

def test_ranged_optional_holidays(self):
opt_holidays = India(categories=OPTIONAL)

Expand Down Expand Up @@ -501,6 +529,8 @@ def test_l10n_default(self):
self.assertLocalizedHolidays(
("2018-01-13", "Lohri"),
("2018-01-14", "Magh Bihu; Makar Sankranti; Pongal; Uttarayan"),
("2018-01-15", "Thiruvalluvar Day / Mattu Pongal"),
("2018-01-16", "Uzhavar Thirunal"),
("2018-01-24", "UP Formation Day"),
("2018-01-26", "Republic Day"),
("2018-02-13", "Maha Shivaratri"),
Expand Down Expand Up @@ -567,6 +597,8 @@ def test_l10n_hi(self):
"hi",
("2018-01-13", "लोहड़ी"),
("2018-01-14", "उत्तरायण; पोंगल; मकर संक्रांति; माघ बिहू"),
("2018-01-15", "तिरुवल्लुवर दिवस / मट्टू पोंगल"),
("2018-01-16", "उझावर थिरुनल"),
("2018-01-24", "यूपी स्थापना दिवस"),
("2018-01-26", "गणतंत्र दिवस"),
("2018-02-13", "महाशिवरात्रि"),
Expand Down Expand Up @@ -628,6 +660,8 @@ def test_l10n_en_us(self):
"en_US",
("2018-01-13", "Lohri"),
("2018-01-14", "Magh Bihu; Makar Sankranti; Pongal; Uttarayan"),
("2018-01-15", "Thiruvalluvar Day / Mattu Pongal"),
("2018-01-16", "Uzhavar Thirunal"),
("2018-01-24", "UP Formation Day"),
("2018-01-26", "Republic Day"),
("2018-02-13", "Maha Shivaratri"),
Expand Down