Skip to main content

python-date-parser

Perform fast fuzzy parsing of dates in varying formats.

Background

Numerous prior projects to perform fuzzy date parsing are available on PyPI. The best of these appears to be https://pypi.org/project/dateparser/, but I have not tried all of them. All of those I have seen are written in pure-Python, and consequentially are too slow to use when the requirement is to parse tabular data with hundreds of thousands of dates in an interactive manner (e.g. at the time of data upload to a website where an immediate response is needed).

In many cases—arguably including the one motivating creation of this library—transferring the slow operation to a background batch operation is a reasonable approach. However, I learned of the very fast Rust library dateparser (https://crates.io/crates/dateparser), which is as powerful in recognizing many date formats as are any of the Python libraries I explored.

What I have used historically is the fuzzy date matching in Pandas; this is good, but for numerous other reasons, I wish to move away from Pandas (mostly in favor of Polars). However, one area where Pandas currently shines above Polars is in parsing heterogenous dates defined in the same column of source data. Yes, that is bad data and the provider should do better. In the real world, a lot of data looks that way.

This library is a thin wrapper around the existing Rust dateparser and chrono. It was mostly created with the aid of an AI assistant. Although commit messages attribute this Claude, the underlying model used was a slightly customized version of MiniMax M2.7 that was hosted by a smaller AI vendor. I simply used the Claude Code CLI as a way of interacting with the code and model.

This library is thousands of times faster than any pure-Python library for a similar task. I have not yet benchmarked it, but I believe it is also 10x+ faster than similar capability in pandas.to_datetime(..., format="mixed").

Design

The underlying Rust extension exposes three parsing functions. The Rust library created for this binding adds very little to the capabilities of crates it uses.

  • parse(raw: str) -> str | None — accepts a single raw date string and returns its ISO-8601 representation (or None for inputs the parser can't handle). No JSON encoding round-trip.

  • parse_list(raw_dates: list[str]) -> list[str | None] — accepts a list of raw date strings and returns a list of ISO-8601 strings (or None for inputs the parser can't handle). The returned list matches the input length and order. This is the bulk-list path: one Rust call for the whole list, no JSON encoding involved.

  • parse_series(s: pl.Series) -> pl.Series — accepts a Polars Series of string dtype and returns a Polars Series of pl.Datetime("ns") (naive UTC, nanosecond precision). Unparseable strings become null values in the result. The Polars path works directly on the underlying Arrow buffer via pyo3-polars, so there is no Python-level iteration or list materialization.

All three paths use the same parsing logic via the dateparser crate.

>>> import date_parser
>>> date_parser.parse("2026-01-01")
'2026-01-01 00:00:00+00:00'
>>> date_parser.parse("garbage") is None
True
>>> date_parser.parse_list(["2026-01-01", "garbage", "06/15/2024"])
['2026-01-01 00:00:00+00:00', None, '2024-06-15 00:00:00+00:00']

>>> import polars as pl
>>> date_parser.parse_series(pl.Series(["2026-01-01", "garbage"])).dtype
Datetime('ns')

Note: parsed datetimes are normalized to UTC (+00:00), matching the behavior of the dateparser Rust crate. The Python dateparser library preserves the original timezone offset; we don't (yet).

Pure-numeric inputs (e.g. "1511648546") are interpreted as Unix timestamps and forced to UTC: 10 digits = seconds, 13 = milliseconds, 16 = microseconds, 19 = nanoseconds. The Python dateparser library interprets these in the local timezone instead.

Installation

pip install gnosis-date-parser

Benchmarking

bin/benchmark.py measures throughput of the three date_parser entry points side-by-side against the Python dateparser reference:

# Benchmark all four libraries (the Rust extension has three modes)
uv run python bin/benchmark.py

# Benchmark a single library
uv run python bin/benchmark.py --library date_parser
uv run python bin/benchmark.py --library date_parser_list
uv run python bin/benchmark.py --library date_parser_series
uv run python bin/benchmark.py --library dateparser

# 10 timed iterations instead of the default 5
uv run python bin/benchmark.py -n 10

The --library choices map to the underlying APIs as follows:

--library API exercised Calls per iteration
date_parser date_parser.parse(s) (per input) len(raw_inputs)
date_parser_list date_parser.parse_list(list) (bulk) 1
date_parser_series date_parser.parse_series(s) (Polars/Arrow) 1
dateparser dateparser.parse(s) (per input, Python) len(raw_inputs)

After each timed run the script verifies the parsed output against the expected ISO-8601 values in tests/data/examples.txt and prints any mismatches.

On my system, at version 1.0, I see:

date_parser (Rust extension, this project) — parse() per input:
  total parses:   475
  failed parses:  0
  elapsed:        0.000 s
  throughput:     1,153,021 dates/sec

verification: 95/95 inputs matched expected

date_parser (Rust extension, this project) — parse() bulk list API:
  total parses:   475
  failed parses:  0
  elapsed:        0.000 s
  throughput:     1,297,230 dates/sec

verification: 95/95 inputs matched expected

date_parser (Rust extension, this project) — parse_series Polars API:
  total parses:   475
  failed parses:  0
  elapsed:        0.000 s
  throughput:     2,001,053 dates/sec

verification: 95/95 inputs matched expected

dateparser (Python reference, https://pypi.org/project/dateparser/):
  total parses:   475
  failed parses:  0
  elapsed:        3.247 s
  throughput:     146 dates/sec

verification: 10/95 inputs did not match expected

[... to be fair, examples were mainly drawn from the underlying Rust crate ...]

speedup (date_parser vs dateparser): 7882.0x faster

Local development

The project uses uv for environment and dependency management.

# Create a venv and install dev dependencies (maturin, pytest, ruff,
# mypy, mkdocs-material, ipython).
uv sync --extra dev

# Compile the Rust extension and install it editable into the venv.
uv run maturin develop --release

# Run the smoke tests (parse, parse_list, parse_series).
uv run pytest -q

# Lint and typecheck.
uv run ruff check .
uv run mypy bin tests date_parser

License

BSD-2-Clause. See LICENSE.

Release files for gnosis-date-parser 1.0.1

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

Source distribution (sdist)

Source distribution for gnosis-date-parser 1.0.1
File Size Uploaded
gnosis_date_parser-1.0.1.tar.gz 135.2 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for gnosis-date-parser 1.0.1
File
gnosis_date_parser-1.0.1-cp310-abi3-win_arm64.whl CPython 3.10 abi3 Windows ARM64 Details
gnosis_date_parser-1.0.1-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
gnosis_date_parser-1.0.1-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
gnosis_date_parser-1.0.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
gnosis_date_parser-1.0.1-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
gnosis_date_parser-1.0.1-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 27.3 MB

Release files / gnosis_date_parser-1.0.1.tar.gz

Download URL gnosis_date_parser-1.0.1.tar.gz
Size 135.2 kB
Tags Source
SHA-256 checksum
How to use checksums
484545caa3b21403c793180e7f24900966fb9c7a44ee20159ba92d88941658db
BLAKE2b-256 checksum
How to use checksums
10fe37a25a291e5ccde8d7f642c0be13deb9787729b4eb8eb1c87891182a3d88
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / gnosis_date_parser-1.0.1-cp310-abi3-win_arm64.whl

Download URL gnosis_date_parser-1.0.1-cp310-abi3-win_arm64.whl
Size 4.4 MB
Tags CPython 3.10 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
969ba11841d7b9dbe73a8ede5cdccaa61befed8ddc729a04377b97e373916c9d
BLAKE2b-256 checksum
How to use checksums
4927cc21292432cf0fdea3b93f83205923d023db6a62e5eee5fc7bec9f39623c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / gnosis_date_parser-1.0.1-cp310-abi3-win_amd64.whl

Download URL gnosis_date_parser-1.0.1-cp310-abi3-win_amd64.whl
Size 5.0 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
2d52a482009e198b808b4aaa0564d8233c8f220b5e12cb27b3ed984f82254f6f
BLAKE2b-256 checksum
How to use checksums
d32a2deec7c3d4e5d39cb1a1de5ac149c724b3d44a43e7666653cee74cb68192
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / gnosis_date_parser-1.0.1-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL gnosis_date_parser-1.0.1-cp310-abi3-musllinux_1_2_x86_64.whl
Size 4.8 MB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
faec8ccd8b11d13246e2115a70812ea8cad6042d21b8fe7702ac2cfcc9aa5d43
BLAKE2b-256 checksum
How to use checksums
016996a3d98863be3fb15fc816fc959011f0d6af20dc70beead52f7e5b372105
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / gnosis_date_parser-1.0.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL gnosis_date_parser-1.0.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 4.6 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
2f4b393c3b19a3abaff79f1bf6f4089d836f177ccd71594149c89ec95530c074
BLAKE2b-256 checksum
How to use checksums
b6ac6a795a91eb1f2a3eb57a3fa352b4331b76ef5095fe2191dedcae4eea6a4c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / gnosis_date_parser-1.0.1-cp310-abi3-macosx_11_0_arm64.whl

Download URL gnosis_date_parser-1.0.1-cp310-abi3-macosx_11_0_arm64.whl
Size 4.0 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
07dfda1080d5fd3f89e94721edf2440d7da7e0171fa7ca635ca354f7f3eb5cb9
BLAKE2b-256 checksum
How to use checksums
3b465a46804d45aa1f5942842b694c681caeaa6d58ba6a858c9382e7f828e620
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / gnosis_date_parser-1.0.1-cp310-abi3-macosx_10_12_x86_64.whl

Download URL gnosis_date_parser-1.0.1-cp310-abi3-macosx_10_12_x86_64.whl
Size 4.4 MB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
5688a82d50dbe2804b89743126c2591d306b50fa31e550e69d1d39c5fc397d51
BLAKE2b-256 checksum
How to use checksums
f263cba421808fe5fcecea735968972aea566d1284325d197e7572a9f761c4af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release history Release notifications | RSS feed

1.0.2

7 release files

This release

1.0.1 This release

7 release files

1.0.0

6 release files

0.1.0

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