Skip to main content

API for the Thai Lunar Calendar

This package provides a simple API for working with the seasons, moon days and holidays of the Thai calendar. Some use cases might include creating a printable calendar or sending a notification when there is an upcoming holiday.

Example: Rains Retreat 2017

from uposatha.calendar import Calendar
from uposatha.elements import HolidayName, SeasonName

cal = Calendar()

rainy_season = [season for season in cal.seasons
                if season.name == SeasonName.RAINY and
                season.first_day.year == 2017][0]


pavarana = [holiday for holiday in rainy_season.holidays
            if holiday.name == HolidayName.PAVARANA][0]

start = rainy_season.first_day.strftime("%d/%m/%y")
end = pavarana.uposatha.falls_on.strftime("%d/%m/%y")

print(f"Rains 2017: {start} to {end}")

Prints: Rains 2017: 09/07/17 to 05/10/17

The Calendar Class

Most users of the package will start like so:

from uposatha.calendar import Calendar
cal = Calendar()

This covers a specific range of dates as we need to know when years have extra months and days provided. You can see the calender range:

>>> cal.start_date
datetime.date(2010, 3, 1)
>>> cal.end_date
datetime.date(2030, 11, 10)

When created, the calendar will generate a tuple of all seasons:

>>> len(cal.seasons)
62

There are two helper functions:

cal.next_uposatha()
cal.current_season()

These return instances of the classes described below.

The Season Class

Season is defined in the uposatha.elements module:

>>> season = cal.seasons[0]
>>> season.first_day
datetime.date(2010, 3, 1)
>>> season.last_day
datetime.date(2010, 7, 26)
>>> season.name
<SeasonName.HOT: 'Hot'>
>>> season.type
<SeasonType.EXTRA_MONTH: 'Extra Month'>

SeasonName and SeasonType are Enum classes defined in uposatha.elements.

The Uposatha Class

Each season has a tuple of Uposathas:

>>> uposatha = season.uposathas[0]
>>> uposatha.falls_on
datetime.date(2010, 3, 15)

You can combine this information with the season:

>>> f"Uposatha {uposatha.number_in_season} of {len(season.uposathas)}"
'Uposatha 1 of 10'

And we have another enum - MoonPhase:

>>> uposatha.moon_phase
<MoonPhase.NEW: 'New'>

The Holiday Class

There are four holidays:

  • Vesak Day
  • Magha Puja
  • Asalha Puja
  • Pavarana Day

Holiday instances can be found in two ways:

>>> vesak = season.holidays[0]
>>> no_holiday = uposatha.holiday

Note that when we created uposatha it was not a holiday. no_holiday is None. Holidays also have a reference to their uposatha:

>>> vesak.uposatha.number_in_season
6

The enum HolidayName is in uposatha.elements:

>>> vesak.name
<HolidayName.VESAK: 'Vesak Day'>

The HalfMoon Class

There is a tuple of half moons in each season. Each is just a date and moon phase.

>>> half_moon = season.half_moons[0]
>>> half_moon.moon_phase
<MoonPhase.WANING: 'Waning'>
>>> half_moon.falls_on
datetime.date(2010, 3, 8)

Calendar Configuration

In order to generate the calendar some information is needed. This includes:

  • Start date
  • Start season
  • End Season
  • End year
  • Years with extra month added.
  • Years with extra day added.

This information is specified in the configure module and is available via the calendar object:

>>> cal.config.start_date
datetime.date(2010, 2, 28)
>>> cal.config.extra_day_years
[2016, 2020, 2025, 2030]

NB: If anyone knows this information beyond 2030, let me know!

Acknowledgements

The starting point of this project was the Forest Sangha calendars. They in turn provide a link to an ical file for importing into various calendar applications. The code for generating this file is available at the splendidmoons github page. This is written in Go and does not provide a licence so I began by parsing the file in python. You can see the code at https://github.com/jhanarato/uposatha-ical

Leveraging that, I went back and wrote the uposatha package from scratch, testing with the data from uposatha-ical. Thanks to the Forest Sangha and the Splendid Moons developers!

Metadata

Release files for uposatha 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for uposatha 0.1.0
File Size Uploaded
uposatha-0.1.0.tar.gz 9.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for uposatha 0.1.0
File Interpreter ABI Platform
uposatha-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 16.9 kB

Release files / uposatha-0.1.0.tar.gz

Download URL uposatha-0.1.0.tar.gz
Size 9.5 kB
Tags Source
SHA-256 checksum
How to use checksums
7d2f49b2d8297ba176bb03ad4fe0dcce2109b2a30ceed69663c63424f60edc5d
BLAKE2b-256 checksum
How to use checksums
578a98ed5134d84cc87c375eecfdeefaa499db3cf0ae0fc6fd97db2ab5c59a66
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.12

Release files / uposatha-0.1.0-py3-none-any.whl

Download URL uposatha-0.1.0-py3-none-any.whl
Size 7.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cc5c575f0dc497bd3c1d8687bb09b9d46bb7795e1d7eedf8675a46e9479707ad
BLAKE2b-256 checksum
How to use checksums
5959a111a94d6a9649730ec0d9e9571113724c4a94178493a1640c9a732c6924
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.12

Release history Release notifications | RSS feed

0.1.1

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page