Skip to main content

A small Python package for date handling including support for BC dates and uncertainty

Project description

historicaldate

A small Python package for date handling including support for BC dates and uncertainty.

$ pip install historicaldate

PyPI: https://pypi.org/project/historicaldate/

Documentation: https://historicaldate.readthedocs.io/en/stable/

The package provides a parser for date formats that are often used to indicate uncertain dates, such as

  • circa 1989
  • between 1920 and 1934
  • 2003
  • circa 1483 earliest 1483

These string are converted to a HDate() object, which stores the earliest, latest possible and an approximate midpoint date corresponding to the original string. These dates are stored as:

  1. Ordinals. These correspond to Python datetime ordinals for AD dates, extended backwards to non-positive values for BC dates.
  2. Python datetime.date, for AD dates only.

The package is intended for dealing with historical events. It does not support time of day, and at present takes a naive approach to the difference between Julian and Gregorian calendars since this is usually what is needed for the expected application areas.

Date formats

Two core formats are supported by default

  • 25 Dec 1066 (or variants such as 25th Dec 1066 or 25 December 1066 etc.)
  • 1066-12-25

Additional formats are also supported

Specifying dateformat="dmy" (as a parameter to the HDate constructor ) also allows...

  • 25/12/1066

Specifying dateformat="mdy" allows...

  • 12/25/1066
  • Dec 25, 1066
  • 1066-12-25

But does not allow...

  • 25/12/1066
  • 25 Dec 1066

The exact date is not required

These are all allowed:

  • Dec 1066
  • 1066
  • 1066-12
  • circa 1066
  • c. 1066
  • between 1066 and 1068
  • circa 1483 earliest 1483

Ongoing events are supported

A date value of 'ongoing' leads to the earliest and midpoint dates taking values datetime.date.today(), the late date being a few years in the future, with flags set for 'ongoing'

The difference between Julian and Gregorian calendars is (as yet) ignored

Python dates are used for AD (CE) timeline displays, and 25 Dec 1066 converts to the Python date 1066-12-25.

This gets us into the tricky question of the few days difference between the Julian and Gregorian calendars. The approach here is (at least for the moment) to observe that this difference doesn't have any significant impact on most expected application areas, and so can be ignored.

In effect this package naively assumes that any AD date string passed to HDate is (proleptic) Gregorian, the same assumption that is made by Python's datetime.date. This is 'naive' because the usual convention when quoting historical dates is to use the calendar in operation at the relevant place at the time. So when we say that the coronation of William I of England took place on 25 Dec 1066, that is a Julian date, not a proleptic Gregorian date (which I believe would be 31 Dec 1066).

It's expected this approach will continue to be the default, since to do anything else would make things unnecessarily more complex for most applications. It's possible however that Julian / Gregorian conversion functionality may be added to future versions

(Proleptic Gregorian Calendar: A Gregorian calendar extended backwards in time before the dates, starting in the 16th century AD, that the Gregorian calendar was actually introduced)

Dealing with dates - the HDate() class

Objects of this class have a property pdates, a dictionary encoding the date information.

Examples

>>>from historicaldate import hdate
>>>hd1 = hdate.HDate('Dec 1066')
>>>print(hd1.pdates)
{'mid': datetime.date(1066, 12, 15), 'ordinal_mid': 389332, 'slmid': 'm', 
 'late': datetime.date(1066, 12, 31), 'ordinal_late': 389348, 'sllate': 'm',
 'early': datetime.date(1066, 12, 1), 'ordinal_early': 389318, 'slearly': 'm'}
>>>
>>>hd2 = hdate.HDate('Dec 20, 1066', dateformat="mdy")
>>>print(hd2.pdates)
{'mid': datetime.date(1066, 12, 20), 'ordinal_mid': 389337, 'slmid': 'd',
 'late': datetime.date(1066, 12, 20), 'ordinal_late': 389337, 'sllate': 'd',
 'early': datetime.date(1066, 12, 20), 'ordinal_early': 389337, 'slearly': 'd'}
>>>
>>>hd3 = hdate.HDate('385 BC')
>>> print(hd3.pdates)
{'mid': None, 'ordinal_mid': -140455, 'slmid': 'y', 
 'late': None, 'ordinal_late': -140256, 'sllate': 'y', 
 'early': None, 'ordinal_early': -140621, 'slearly': 'y'}

All dates (AD and BC) are given values of ordinal_early, ordinal_mid and ordinal_late. These represent the earliest possible, midpoint and latest possible ordinals (int) corresponding to the date specified.

These are usual Python date ordinals (int) for AD dates as created by datetime.date.toordinal(), extended backwards in time to non-positive numbers for BC dates assuming that 1BC, 5BC etc. are leap years. See above for how the few days difference between the Julian and Gregorian calendars is treated.

AD dates are also given values of early, mid and late, which are the equivalent Python dates (datetime.date objects).

The dictionary members slearly, slmid and sllate indicate the 'specification level' of the corresponding date, and take the following values:

Value Meaning
'd' day
'm' month
'y' year
'c' Derived from a 'circa' calculation
'o' Derived from an 'ongoing' calculation

Changes

New in 0.1.0, 0.1.1, 0.1.2

Cleaned up for PyPI release

New in 0.0.7

The package has been trimmed down to date treatment only. The Plotly utilities included in older versions are now at https://github.com/dh3968mlq/hdtimelines

New in 0.0.5

  • BC dates are now supported
  • Ordinal dates implemented
  • dateformat implemented, allowing dates to be formatted as 25/12/1066 or 12/25/1066 or Dec 25, 1066

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

historicaldate-0.1.2.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

historicaldate-0.1.2-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file historicaldate-0.1.2.tar.gz.

File metadata

  • Download URL: historicaldate-0.1.2.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.4

File hashes

Hashes for historicaldate-0.1.2.tar.gz
Algorithm Hash digest
SHA256 ad49c21e2118e47492b2ea1d290acf218c71d36f9af9a0893da8431bbee63e73
MD5 706e69d381825843674d3439e2cdf753
BLAKE2b-256 6275b29df5f582d41b8e180a15df137ca1be532346cfa9fe292ea20f0989324f

See more details on using hashes here.

File details

Details for the file historicaldate-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: historicaldate-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 10.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.4

File hashes

Hashes for historicaldate-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a18943255e17a6f5151ae846b6fba4b8bddae35b2551c3e3ff908edb8feee452
MD5 d4dde1038cce40d9a0546ecfc4f4eb17
BLAKE2b-256 28ea51204013d990d4f63e6b02f1c12074c2f0b62e586a2baaf3fd072f62bbe3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page