Skip to content

Repository files navigation

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.

http://img.shields.io/travis/dr-prodigy/python-holidays/masterhttp://img.shields.io/coveralls/dr-prodigy/python-holidays/master

Example Usage

fromdatetimeimportdateimportholidaysus_holidays=holidays.UnitedStates()
# or:# us_holidays = holidays.US()# or:# us_holidays = holidays.CountryHoliday('US')# or, for specific prov / states:# us_holidays = holidays.CountryHoliday('US', prov=None, state='CA')date(2015, 1, 1) inus_holidays# Truedate(2015, 1, 2) inus_holidays# False# The Holiday class will also recognize strings of any format# and int/float representing a Unix timestamp'2014-01-01'inus_holidays# True'1/1/2014'inus_holidays# True1388597445inus_holidays# Trueus_holidays.get('2014-01-01') # "New Year's Day"us_holidays['2014-01-01': '2014-01-03'] # [date(2014, 1, 1)]us_pr_holidays=holidays.UnitedStates(state='PR') # or holidays.US(...), or holidays.CountryHoliday('US', state='PR')# some holidays are only present in parts of a country'2018-01-06'inus_holidays# False'2018-01-06'inus_pr_holidays# True# Easily create custom Holiday objects with your own dates instead# of using the pre-defined countries/states/provinces availablecustom_holidays=holidays.HolidayBase()
# Append custom holiday dates by passing:# 1) a dict with date/name key/value pairs,custom_holidays.append({"2015-01-01": "New Year's Day"})
# 2) a list of dates (in any format: date, datetime, string, integer),custom_holidays.append(['2015-07-01', '07/04/2015'])
# 3) a single date itemcustom_holidays.append(date(2015, 12, 25))
date(2015, 1, 1) incustom_holidays# Truedate(2015, 1, 2) incustom_holidays# False'12/25/2015'incustom_holidays# True# For more complex logic like 4th Monday of January, you can inherit the# HolidayBase class and define your own _populate(year) method. See below# documentation for examples.

Install

The latest stable version can always be installed or updated via pip:

$ pip install holidays

If the above fails, please use easy_install instead:

$ easy_install holidays

Available Countries

CountryISO codeProvinces/States Available
AngolaAO/AGONone
ArgentinaAR/ARGNone
ArubaAW/ABWNone
AustraliaAU/AUSprov = ACT (default), NSW, NT, QLD, SA, TAS, VIC, WA
AustriaAT/AUTprov = 1, 2, 3, 4, 5, 6, 7, 8, 9 (default)
BangladeshBD/BDGNone
BelarusBY/BLRNone
BelgiumBE/BELNone
BrazilBR/BRAstate = AC, AL, AP, AM, BA, CE, DF, ES, GO, MA, MT, MS, MG, PA, PB, PE, PI, RJ, RN, RS, RO, RR, SC, SP, SE, TO
BulgariaBG/BLGNone
BurundiBI/BDINone
CanadaCA/CANprov = AB, BC, MB, NB, NL, NS, NT, NU, ON (default), PE, QC, SK, YU
ChileCL/CHLstate = AI, AN, AP, AR, AT, BI, CO, LI, LL, LR, MA, ML, NB, RM, TA, VS
ColombiaCO/COLNone
CroatiaHR/HRVNone
CzechiaCZ/CZENone
DenmarkDK/DNKNone
DjiboutiDJ/DJINone
DominicanRepublicDO/DOMNone
EgyptEG/EGYNone
EnglandNone
EstoniaEE/ESTNone
EuropeanCentralBankECB/TARTrans-European Automated Real-time Gross Settlement (TARGET2)
FinlandFI/FINNone
FranceFR/FRAMétropole (default), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion, Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna
GermanyDE/DEUprov = BW, BY, BYP, BE, BB, HB, HH, HE, MV, NI, NW, RP, SL, SN, ST, SH, TH
GreeceGR/GRCNone
HondurasHN/HNDNone
HongKongHK/HKGNone
HungaryHU/HUNNone
IcelandIS/ISLNone
IndiaIN/INDprov = AS, SK, CG, KA, GJ, BR, RJ, OD, TN, AP, WB, KL, HR, MH, MP, UP, UK, TN
IrelandIE/IRLNone
IsleOfManNone
IsraelIL/ISRNone
ItalyIT/ITAprov = AN, AO, BA, BL, BO, BS, BZ, CB, Cesena, CH, CS, CT, EN, FC, FE, FI, Forlì, FR, GE, GO, IS, KR, LT, MB, MI, MO, MN, MS, NA, PA, PC, PD, PG, PR, RM, SP, TS, VI
JapanJP/JPNNone
KenyaKE/KENNone
KoreaKR/KORNone
LatviaLV/LVANone
LithuaniaLT/LTUNone
LuxembourgLU/LUXNone
MalawiMW/MWINone
MexicoMX/MEXNone
MoroccoMA/MORNone
NetherlandsNL/NLDNone
NewZealandNZ/NZLprov = NTL, AUK, TKI, HKB, WGN, MBH, NSN, CAN, STC, WTL, OTA, STL, CIT
NicaraguaNI/NICprov = MN
NigeriaNG/NGANone
NorthernIrelandNone
NorwayNO/NORNone
ParaguayPY/PRYNone
PeruPE/PERNone
PolandPL/POLNone
PortugalPT/PRTNone
PortugalExtPTE/PRTEPortugal plus extended days most people have off
RomaniaRO/ROUNone
RussiaRU/RUSNone
ScotlandNone
SerbiaRS/SRBNone
SingaporeSG/SGPNone
SlovakiaSK/SVKNone
SloveniaSI/SVNNone
SouthAfricaZA/ZAFNone
SpainES/ESPprov = AN, AR, AS, CB, CL, CM, CN, CT, EX, GA, IB, MC, MD, NC, PV, RI, VC
SwedenSE/SWENone
SwitzerlandCH/CHEprov = AG, AR, AI, BL, BS, BE, FR, GE, GL, GR, JU, LU, NE, NW, OW, SG, SH, SZ, SO, TG, TI, UR, VD, VS, ZG, ZH
TurkeyTR/TURNone
UkraineUA/UKRNone
UnitedArabEmiratesAE/ARENone
UnitedKingdomGB/GBR/UKNone
UnitedStatesUS/USAstate = 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
VietnamVN/VNM
WalesNone

API

class holidays.HolidayBase(years=[], expand=True, observed=True, prov=None, state=None)
The base class used to create holiday country classes.

Parameters:

years
An iterable list of integers specifying the years that the Holiday object should pre-generate. This would generally only be used if setting expand to False. (Default: [])
expand
A boolean value which specifies whether or not to append holidays in new years to the holidays object. (Default: True)
observed
A boolean value which when set to True will include the observed day of a holiday that falls on a weekend, when appropriate. (Default: True)
prov
A string specifying a province that has unique statutory holidays. (Default: Australia='ACT', Canada='ON', NewZealand=None)
state
A string specifying a state that has unique statutory holidays. (Default: UnitedStates=None)

Methods:

get(key, default=None)
Returns a string containing the name of the holiday(s) in date key, which can be of date, datetime, string, unicode, bytes, integer or float type. If multiple holidays fall on the same date the names will be separated by commas
get(key, default=None)
Returns a string containing the name of the holiday(s) in date key, which can be of date, datetime, string, unicode, bytes, integer or float type. If multiple holidays fall on the same date the names will be separated by commas
get_list(key)
Same as get except returns a list of holiday names instead of a comma separated string
get_named(name)
Returns a list of holidays matching (even partially) the provided name (case insensitive check)
pop(key, default=None)
Same as get except the key is removed from the holiday object
pop_named(name)
Same as pop but takes the name of the holiday (or part of it) rather than the date
update/append
Accepts dictionary of {date: name} pairs, a list of dates, or even singular date/string/timestamp objects and adds them to the list of holidays

More Examples

# Simplest example possible>>>fromdatetimeimportdate>>>importholidays>>>date(2014, 1, 1) inholidays.US()
True>>date(2014, 1, 2) inholidays.US()
False# But this is not efficient because it is initializing a new Holiday object# and generating a list of all the holidays in 2014 during each comparison# It is more efficient to create the object only once>>>us_holidays=holidays.US()
>>>date(2014, 1, 1) inus_holidaysTrue>>date(2014, 1, 2) inus_holidaysFalse# Each country has three class names that can be called--a full name# and the 2 and 3-digit ISO codes. Use whichever you prefer.>>>holidays.UnitedStates() ==holidays.US()
True>>>holidays.Canada() ==holidays.CA()
True>>>holidays.US() ==holidays.CA()
False# Let's print out the holidays in 2014 specific to California, USA>>>fordate, nameinsorted(holidays.US(state='CA', years=2014).items()):
>>>print(date, name)
2014-01-01NewYear'sDay2014-01-20MartinLutherKingJr. Day2014-02-15SusanB. AnthonyDay2014-02-17Washington'sBirthday2014-03-31CésarChávezDay2014-05-26MemorialDay2014-07-04IndependenceDay2014-09-01LaborDay2014-10-13ColumbusDay2014-11-11VeteransDay2014-11-27Thanksgiving2014-12-25ChristmasDay# So far we've only checked holidays in 2014 so that's the only year the# Holidays object has generated>>>us_holidays.yearsset([2014])
>>>len(us_holidays)
10# Because by default the `expand` param is True the Holiday object will add# holidays from other years as they are required.>>>date(2013, 1, 1) inus_holidaysTrue>>>us_holidays.yearsset([2013, 2014])
>>>len(us_holidays)
20# If we change the `expand` param to False the Holiday object will no longer# add holidays from new years>>>us_holidays.expand=False>>>date(2012, 1, 1) inus_holidaysFalse>>>us.holidays.expand=True>>>date(2012, 1, 1) inus_holidaysTrue# January 1st, 2012 fell on a Sunday so the statutory holiday was observed# on the 2nd. By default the `observed` param is True so the holiday list# will include January 2nd, 2012 as a holiday.>>>date(2012, 1, 1) inus_holidaysTrue>>>us_holidays[date(2012, 1, 1)]
"New Year's Day">>>date(2012, 1, 2) inus_holidaysTrue>>>us_holidays.get(date(2012 ,1, 2))
"New Year's Day (Observed)"# The `observed` and `expand` values can both be changed on the fly and the# holiday list will be adjusted accordingly>>>us_holidays.observed=False>>>date(2012, 1, 2) inus_holidaysFalseus_holidays.observed=True>>date(2012, 1, 2) inus_holidaysTrue# Holiday objects can be added together and the resulting object will# generate the holidays from all of the initial objects>>>north_america=holidays.CA() +holidays.US() +holidays.MX()
>>>north_america.get('2014-07-01')
"Canada Day">>>north_america.get('2014-07-04')
"Independence Day"# The other form of addition is also available>>>north_america=holidays.Canada()
>>>north_america+=holidays.UnitedStates()
>>>north_america+=holidays.Mexico()
>>>north_america.country
['CA', 'US', 'MX']
# We can even get a set of holidays that include all the province- or# state-specific holidays using the built-in sum() function>>>a=sum([holidays.CA(prov=x) forxinholidays.CA.PROVINCES])
>>>a.provPROVINCES= ['AB', 'BC', 'MB', 'NB', 'NL', 'NS', 'NT', 'NU', 'ON', 'PE',
'QC', 'SK', 'YU']
# Holidays can be retrieved using their name too.# `get_named(key)` receives a string and returns a list of holidays# matching it (even partially, with case insensitive check)>>>us_holidays=holidays.UnitedStates(years=2020)
>>>us_holidays.get_named('day')
[datetime.date(2020, 1, 1), datetime.date(2020, 1, 20),
datetime.date(2020, 2, 17), datetime.date(2020, 5, 25),
datetime.date(2020, 7, 4), datetime.date(2020, 7, 3),
datetime.date(2020, 9, 7), datetime.date(2020, 10, 12),
datetime.date(2020, 11, 11), datetime.date(2020, 12, 25)]
# Sometimes we may not be able to use the official federal statutory# holiday list in our code. Let's pretend we work for a company that# does not include Columbus Day as a statutory holiday but does include# "Ninja Turtle Day" on July 13th. We can create a new class that inherits# the UnitedStates class and the only method we need to override is _populate()>>>classCorporateHolidays(holidays.UnitedStates):
>>>def_populate(self, year):
>>># Populate the holiday list with the default US holidays>>>holidays.UnitedStates._populate(self, year)
>>># Remove Columbus Day>>>self.pop_named("Columbus Day")
>>># Add Ninja Turtle Day>>>self[date(year, 7, 13)] ="Ninja Turtle Day">>>date(2014, 10, 14) inHolidays(country="US")
True>>>date(2014, 10, 14) inCorporateHolidays(country="US")
False>>>date(2014, 7, 13) inHolidays(country="US")
False>>>date(2014 ,7, 13) inCorporateHolidays(country="US")
True# We can also inherit from the HolidayBase class which has an empty# _populate method so we start with no holidays and must define them# all ourselves. This is how we would create a holidays class for a country# that is not supported yet.>>>classNewCountryHolidays(holidays.HolidayBase):
>>>def_populate(self, year):
>>>self[date(year, 1, 2)] ="Some Federal Holiday">>>self[date(year, 2, 3)] ="Another Federal Holiday">>>hdays=NewCountryHolidays()
# We can also include prov/state specific holidays in our new class.>>>classNewCountryHolidays(holidays.HolidayBase):
>>>def_populate(self, year):
>>># Set default prov if not provided>>>ifself.prov==None:
>>>self.prov='XX'>>>self[date(year, 1, 2)] ="Some Federal Holiday">>>ifself.prov=='XX':
>>>self[date(year, 2, 3)] ="Special XX province-only holiday">>>ifself.prov=='YY':
>>>self[date(year, 3, 4)] ="Special YY province-only holiday">>>hdays=NewCountryHolidays()
>>>hdays=NewCountryHolidays(prov='XX')
# If you write the code necessary to create a holiday class for a country# not currently supported please contribute your code to the project!# Perhaps you just have a list of dates that are holidays and want to turn# them into a Holiday class to access all the useful functionality. You can# use the append() method which accepts a dictionary of {date: name} pairs,# a list of dates, or even singular date/string/timestamp objects.>>>custom_holidays=holidays.HolidayBase()
>>>custom_holidays.append(['2015-01-01', '07/04/2015'])
>>>custom_holidays.append(date(2015, 12, 25))
>>> from datetime import date
>>> holidays.US()[date(2013, 12, 31): date(2014, 1, 2)]

# Intermediate years are only shown if they are listed in the years parameter.

>>> holidays.US(years=[2014])[datetime.date(2013, 1, 1): datetime.date(2015, 12, 31)]

Development Version

The latest development (beta) version can be installed directly from GitHub:

$ pip install --upgrade https://github.com/dr-prodigy/python-holidays/tarball/beta

All new features are always first pushed to beta branch, then released on master branch upon official version upgrades.

Running Tests

$ pip install flake8
$ flake8
$ python tests.py

Coverage

$ pip install coverage
$ coverage run --omit=*site-packages* tests.py
$ coverage report -m

Contributions

Issues and Pull Requests are always welcome.

When contributing with fixes and new features, please start forking/branching from beta branch, to work on latest code and reduce merging issues.

Also, whenever possible, please provide 100% test coverage for your new code.

Thanks a lot for your support.

License

Code and documentation are available according to the MIT License (see LICENSE).

About

Generate and work with holidays in Python

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages