A comprehensive Python library for the Ethiopian calendar, handling conversions, holidays (Bahire Hasab), and date arithmetic.
Project description
Kenat_PY · ቀናት 🇪🇹
A complete Ethiopian Calendar & Bahire Hasab toolkit for Python
📌 Overview
Kenat (Amharic: ቀናት) is a powerful and authentic Ethiopian calendar library for Python. It offers full support for date conversion, holiday computation (including Bahire Hasab), localized formatting, Geez numerals, and more — all without external dependencies.
🚀 Ported from the original kenat JS library.
✨ Features
- 🔄 Bidirectional Conversion: Ethiopian ↔ Gregorian calendars
- 📅 Full Holiday System: Christian, Muslim, cultural, and public holidays
- ⛪ Bahire Hasab: Accurate movable feast calculations (e.g. Fasika, Tsome Nebiyat)
- 🏷️ Holiday Filtering: Filter holidays by type (
public,christian,muslim, etc.) - 📆 Date Arithmetic: Add/subtract days, months, years (13-month calendar support)
- 🔠 Localized Formatting: Amharic and English support
- 🔢 Geez Numerals: Convert integers to ግዕዝ numeral strings
- ⏰ Ethiopian Time Support: 12-hour Ethiopian ↔ 24-hour Gregorian
- 🗓️ Calendar Grids: Monthly/yearly calendar generation
🚀 Installation
Install the library from source:
pip install .
For development/testing:
pip install -e ".[test]"
🟢 Quick Start
from kenat import Kenat
today = Kenat.now()
print(today.get_ethiopian())
# → {'year': 2017, 'month': 9, 'day': 26}
print(today.format({'lang': 'english', 'show_weekday': True}))
# → "Tuesday, Ginbot 26 2017"
⛪ Bahire Hasab & Holiday System
Get All Holidays in a Year
from kenat import get_holidays_for_year
holidays = get_holidays_for_year(2017)
# Example: Find Fasika (Easter)
fasika = next(h for h in holidays if h['key'] == 'fasika')
print(fasika['ethiopian']) # → {'year': 2017, 'month': 8, 'day': 21}
Filter Holidays by Type
from kenat import get_holidays_for_year, HolidayTags
# Public only
get_holidays_for_year(2017, filter_by=HolidayTags.PUBLIC)
# Christian and Muslim holidays
get_holidays_for_year(2017, filter_by=[HolidayTags.CHRISTIAN, HolidayTags.MUSLIM])
Check if a Date is a Holiday
from kenat import Kenat
meskel = Kenat("2017/1/17")
print(meskel.is_holiday()) # → [Holiday object]
non_holiday = Kenat("2017/1/18")
print(non_holiday.is_holiday()) # → []
Access Bahire Hasab Calculations
from kenat import Kenat
bh = Kenat("2017/1/1").get_bahire_hasab()
print(bh['evangelist']) # → {'name': 'ማቴዎስ', 'remainder': 1}
print(bh['movableFeasts']['fasika']['ethiopian'])
# → {'year': 2017, 'month': 8, 'day': 21}
➕ More API Examples
Date Arithmetic
from kenat import Kenat
date = Kenat("2017/2/10")
print(date.add(days=10)) # → Add days
print(date.add(months=-1)) # → Subtract a month
Date Difference
from kenat import Kenat
a = Kenat("2015/5/15")
b = Kenat("2012/5/15")
print((a - b).days) # → 1095 days
print(a.diff_in_days(b)) # → 1095
Geez Numerals
from kenat import to_geez
print(to_geez(2017)) # → ፳፻፲፯
🧱 Contributing
- Fork & clone the repo
- Create a new branch:
git checkout -b feature/your-feature - Make your changes, add tests in
/tests/ - Run
pytestto ensure everything passes - Submit a pull request 🚀
👨💻 Author
Melaku Demeke GitHub: @melakud
📄 License
MIT License — see LICENSE for details.
Let me know if you want to:
- add badges (PyPI, license, tests)
- include an animated GIF demo (e.g. calendar grid or console output)
- or generate this as a
README.mdfile automatically.
Project details
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 kenat-1.0.0.tar.gz.
File metadata
- Download URL: kenat-1.0.0.tar.gz
- Upload date:
- Size: 34.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
573249d8c61a40a11ca584a0512a6e37f6b022f0591417d81afafbdfb21338ac
|
|
| MD5 |
5d92aeaed00e2493020ab56df2f48383
|
|
| BLAKE2b-256 |
7d93d109c253f2d902ad21cf010a846c40e851ff770264f8835f2d0933c1e363
|
File details
Details for the file kenat-1.0.0-py3-none-any.whl.
File metadata
- Download URL: kenat-1.0.0-py3-none-any.whl
- Upload date:
- Size: 27.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81d38593ed4db3dab77227a9e300e2e07dcb8b71251eeb53ad5ea092131b7190
|
|
| MD5 |
89f0e88d0876f5d05bd4a8604927aa17
|
|
| BLAKE2b-256 |
f2e21f23091948cbd7d973518493545bf551a935d194b0ef65ddbf331f262fbf
|