Lookup dates for events that cause unusual attendance patterns (Super Bowl, Oscars, World Series, ...) using Wikidata as the source of truth.
Project description
special-days
Lookup dates for events that cause unusual attendance patterns at venues: Super Bowl Sunday, Oscars night, World Series Game 7, NCAA championship, etc. Data is sourced from Wikidata, so it doesn't go stale.
Zero runtime dependencies — only the Python standard library.
Status
Alpha. Currently supports: Super Bowl, Academy Awards (Oscars). More events to come.
Install
pip install special-days
Use
Two APIs over the same data. Pick whichever fits your question.
Year-keyed (planner-style)
from datetime import date
from special_days import super_bowl
super_bowl.date(2025)
# datetime.date(2025, 2, 9)
super_bowl.is_super_bowl_sunday(date(2025, 2, 9))
# True
super_bowl.all_known()
# {1967: date(1967, 1, 15), ..., 2026: date(2026, 2, 8)}
Date-keyed (holidays-compatible)
A dict-like class keyed by datetime.date, lazy on construction — only
years you actually query get loaded.
from datetime import date
from special_days import SuperBowl, SpecialDays, union
sb = SuperBowl()
date(2025, 2, 9) in sb # True
sb[date(2025, 2, 9)] # 'Super Bowl'
sb.get_list(date(2025, 2, 9)) # ['Super Bowl']
# eager mode, like holidays.US(years=2025)
SuperBowl(years=[2024, 2025])
# edition-numbered labels for display strings
SuperBowl(label_with_edition=True)[date(2025, 2, 9)] # 'Super Bowl LIX'
Compose with the holidays package
via union(...), preserving laziness on both sides:
import holidays
from special_days import SpecialDays, union
combined = union(holidays.US(), SpecialDays()) # all known events
combined.get_list(date(2025, 2, 9)) # ['Super Bowl']
combined.get_list(date(2025, 3, 2)) # ['Academy Awards']
combined.get_list(date(2025, 7, 4)) # ['Independence Day']
SpecialDays(events=...) accepts registered string names
("super_bowl", "oscars"), event classes (SuperBowl, Oscars),
or pre-built instances. With no argument it includes everything the
package ships.
Far-future years
A snapshot through Super Bowl LX (Feb 8, 2026) ships with the package, so lookups for known years work offline. Asking for an unknown year transparently refreshes from Wikidata:
super_bowl.date(2035) # hits Wikidata, caches the result
Disable the network fallback explicitly if you need it:
super_bowl.date(2035, allow_network=False) # raises KeyError
Force a refresh:
super_bowl.refresh() # re-fetch everything, update local cache
Why Wikidata?
- Structured. Each Super Bowl has a stable Q-ID with a "point in time" property. We query that property directly — no HTML scraping, no infobox parsing.
- Long-lived. Wikidata has been stable since 2012 and is increasingly the upstream source for Wikipedia infoboxes.
- Public, no auth. No API keys, no signup, generous rate limits for conservative use like ours.
The package ships an offline snapshot so first use doesn't require network, and degrades gracefully when Wikidata is unreachable.
Cache
Refreshed data is cached at
$XDG_CACHE_HOME/special-days/ (or ~/.cache/special-days/ on most
systems). Safe to delete; it will be repopulated.
Tests
make venv && make install # one-time setup
make test # unit tests (mocked HTTP) — fast, always run
make test-live # opt-in: hits the real Wikidata SPARQL endpoint
The live tests exist precisely to catch the case where Wikidata reshapes
its data and our SPARQL query stops returning the right items. If they
fail, update EVENT_DATES_QUERY in src/special_days/_wikidata.py and
cut a new release.
Maintenance
To regenerate every shipped snapshot from current Wikidata data:
make snapshots-live
make snapshots (no -live) writes embedded hand-curated lists where
they exist — use this if Wikidata is wrong about a specific date and
you want to ship a correction. Per-event targets:
make snapshot-super-bowl, make snapshot-super-bowl-live,
make snapshot-oscars, make snapshot-oscars-live.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file special_days-0.2.0.tar.gz.
File metadata
- Download URL: special_days-0.2.0.tar.gz
- Upload date:
- Size: 23.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a23f7480424f0ab96411a8e8ae51da9bddd06faac2abf10a5f2a42c1079307fd
|
|
| MD5 |
52c1e8e3c25c999b43ffee60f425e397
|
|
| BLAKE2b-256 |
7d44698787584954b2bf9d7d3db6fb0fbd6d3350527a5be89ac6e3d11ddf5844
|
Provenance
The following attestation bundles were made for special_days-0.2.0.tar.gz:
Publisher:
release.yml on stringertheory/special-days
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
special_days-0.2.0.tar.gz -
Subject digest:
a23f7480424f0ab96411a8e8ae51da9bddd06faac2abf10a5f2a42c1079307fd - Sigstore transparency entry: 1521433188
- Sigstore integration time:
-
Permalink:
stringertheory/special-days@55d152c7021f3f0cb53d50fd73d187abbfe175fd -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/stringertheory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@55d152c7021f3f0cb53d50fd73d187abbfe175fd -
Trigger Event:
push
-
Statement type:
File details
Details for the file special_days-0.2.0-py3-none-any.whl.
File metadata
- Download URL: special_days-0.2.0-py3-none-any.whl
- Upload date:
- Size: 17.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a144d266529d7ba69d16833a1ffbb2fd39759ae2aaf43a08e9c870dd446b9a15
|
|
| MD5 |
8d48e8cd66ff894bbf2a1636607a6a0b
|
|
| BLAKE2b-256 |
c5a1e664f75bc93c79de01d32551ae1f1aa25ed87b48d4fab9d377c3d7b0fbce
|
Provenance
The following attestation bundles were made for special_days-0.2.0-py3-none-any.whl:
Publisher:
release.yml on stringertheory/special-days
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
special_days-0.2.0-py3-none-any.whl -
Subject digest:
a144d266529d7ba69d16833a1ffbb2fd39759ae2aaf43a08e9c870dd446b9a15 - Sigstore transparency entry: 1521433241
- Sigstore integration time:
-
Permalink:
stringertheory/special-days@55d152c7021f3f0cb53d50fd73d187abbfe175fd -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/stringertheory
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@55d152c7021f3f0cb53d50fd73d187abbfe175fd -
Trigger Event:
push
-
Statement type: