Formatting utility for international postal addresses
Project description
Prefix date parser
This is a helper class to parse dates with varied degrees of precision. For
example, a data source might state a date as 2001
, 2001-4
or 2001-04-02
,
with the implication that only the year, month or day is known. This library
will process such partial dates into a structured format and allow their
validation and re-formatting (e.g. turning 2001-4
into 2001-04
above).
The library does not support the complexities of the ISO 8601 and RFC 3339 standards including date ranges and calendar-week/day-of-year notations.
Installation
Install prefixdate
using PyPI:
$ pip install prefixdate
Usage
The library provides a variety of helper functions to parse and format partial dates:
from prefixdate import parse, normalize_date, Precision
# Parse returns a `DatePrefix` object:
date = parse('2001-3')
assert date.text == '2001-03'
date = parse(2001)
assert date.text == '2001'
assert date.precision == Precision.YEAR
date = parse(None)
assert date.text is None
assert date.precision == Precision.EMPTY
# This will also be the outcome for invalid dates!
# Normalize to a standard string:
assert normalize_date('2001-1') == '2001-01'
assert normalize_date('2001-00-00') == '2001'
assert normalize_date('Boo!') is None
# This also works for datetimes:
from datetime import datetime
now = datetime.utcnow().isoformat()
minute = normalize_date(now, precision=Precision.MINUTE)
# You can also feed in None, date and datetime:
normalize_date(datetime.utcnow())
normalize_date(datetime.date())
normalize_date(None)
You can also use the parse_parts
helper, which is similar to the constructor
for a datetime
:
from prefixdate import parse_parts, Precision
date = parse_parts(2001, '3', None)
assert date.precision == Precision.MONTH
assert date.text == '2001-03'
Format strings
For dates which are not already stored in an ISO 8601-like string format, you
can supply one or many format strings for datetime.strptime
. The format strings
will be analysed to determine how precise the resulting dates are expected to be.
from prefixdate import parse_format, parse_formats, Precision
date = parse_format('YEAR 2021', 'YEAR %Y')
assert date.precision == Precision.YEAR
assert date.text == '2021'
# You can try out multiple formats in sequence. The first non-empty prefix
# will be returned:
date = parse_formats('2021', ['%Y-%m-%d', '%Y-%m', '%Y'])
assert date.precision == Precision.YEAR
assert date.text == '2021'
Caveats
- Datetimes are always converted to UTC and made naive (tzinfo stripped)
- Does not process milliseconds yet.
- Does not process invalid dates, like Feb 31st.
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
File details
Details for the file prefixdate-0.3.3.tar.gz
.
File metadata
- Download URL: prefixdate-0.3.3.tar.gz
- Upload date:
- Size: 6.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 198a7b5d9107c0e7a2b7a998eaa2e23fabda5bf109b4af074a25da99d4a3375e |
|
MD5 | 60755d712790d88f03535d42511a27e1 |
|
BLAKE2b-256 | 475d1da367a0e8dbf68af7e12369f70721cb95a4e5f25a58f2f0f1c4ef23e3e3 |
File details
Details for the file prefixdate-0.3.3-py2.py3-none-any.whl
.
File metadata
- Download URL: prefixdate-0.3.3-py2.py3-none-any.whl
- Upload date:
- Size: 7.2 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 830a509bda6589f40ea5d5d64a3db1dfd6165867bfc4741d1c9075c59dd14777 |
|
MD5 | 3ad15a2a9cf908f5579dec8d9b063f65 |
|
BLAKE2b-256 | 3331dd49328680b33b23bf3402b530e54b93f889141fc3c4223f70a74b17a079 |