pyudunits2
NOTE: This project is not yet adopted and remains a proof-of-concept. Please open an issue to express your interest in helping to maintain this project.
pyudunits2 is a pure Python library designed for handling units of physical
quantities, fully based on the UDUNITS2 grammar and XML database.
It provides seamless unit conversions and symbolic unit manipulation, making
it an ideal tool for scientific and engineering applications.
Furthermore, as a result of its compatibility with the UDUNITS2 grammar,
pyudunits2 is suitable for working with the
Climate Forecast (CF) conventions.
Key Features
- UDUNITS2 Grammar: The library has a generated parser based on a unit grammar definition adapted from UDUNITS2, ensuring the grammar serves as the canonical source of truth.
- Unit Conversions: Easily convert between related units using optimised and vectorised functions.
- Symbolic Representation: Unit symbols are preserved throughout calculations, ensuring precise definitions remain intact.
- Optimized Performance: When using the UDUNITS2 XML database without extensions, the code follows an optimized path for efficiency. (Not yet implemented)
- Flexible Simplification: By default, units are not reduced to base units
until simplification is explicitly requested, allowing expressions like
mg kg-1for a mass ratio andmicrolitres per litrefor a volume ratio to be propagated through calculations. - Command-Line Interface (CLI): Includes a CLI tool for convenient unit conversion using the UDUNITS2 database.
Examples
Determining if a unit is a length like unit:
>>> from pyudunits2 import UnitSystem
>>> ut_system = UnitSystem.from_udunits2_xml()
>>> unit = ut_system.unit('km/h')
>>> # Note that creating a unit may raise a pyudunits2.UnresolvableUnitException
>>> meters = ut_system.unit('meters')
>>> print(f'Unit {unit} is a length unit?: {unit.dimensionality() == meters.dimensionality()}')
Unit km/h is a length unit?: False
Converting between units:
>>> from pyudunits2 import UnitSystem, Converter
>>> import numpy as np
>>> ut_system = UnitSystem.from_udunits2_xml()
>>> degC = ut_system.unit('degC')
>>> kelvin = ut_system.unit('kelvin')
>>> converter = Converter(degC, kelvin)
>>> print(converter.expression)
value + 273.15
>>> converter.convert(np.array([32, 15, -20]))
array([305.15, 288.15, 253.15])
Command line interface (CLI)
The pyudunits2 CLI offers a number of useful tools for working with udunits2
units. For the complete help, see python -m pyudunits2 --help.
explain-unit
It is possible to get human-readable information about a unit. This information is not intended to be machine readable, can change in the future, and should not be parsed for any purpose.
For example:
$ python -m pyudunits2 explain-unit degC
conversion-expr
Produces a somewhat machine-readable form of the expression required to convert from one unit to another.
For example:
$ python -m pyudunits2 conversion-expr degC degF
1.8*value + 31.2
Alternative unit libraries
There are many unit libraries available within Python. A good default choice would be Pint which offers a compelling user experience and a comprehensive base unit definition.
pyudunits2 unique selling point is its re-implementation of the UDUNITS2
grammar, which is a fundamental part of the
CF Conventions specification. Tight integration between
pyudunits2 and Pint would be a desirable outcome for this library.
The cf-units library wraps the UDUNITS2 C-API (using Cython)
and offers an alternative approach to supporting UDUNITS2 based unit
definitions. The complexity of having a compiled cf-units has been shown to
be a source of pain for both maintenance and use
1
2
.
The xclim library offers some powerful
UDUNITS2-like functionality. It is hoped that pyudunits2 could serve as a
basis for that library in the future.
Release files for pyudunits2 0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyudunits2-0.1.tar.gz | 190.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyudunits2-0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 423.5 kB
Release files / pyudunits2-0.1.tar.gz
| Download URL | pyudunits2-0.1.tar.gz |
|---|---|
| Size | 190.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
791d234d402d8877e55a8baaad4a329c7537a187eda5bfc1b19d33150e0a170a
|
|
BLAKE2b-256 checksum How to use checksums |
3a228c6c8762af2223672bc701d5e72b607a3be4d000f8776c59b72a13a08044
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|
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 Feb 7, 2025.
Transparency logRelease files / pyudunits2-0.1-py3-none-any.whl
| Download URL | pyudunits2-0.1-py3-none-any.whl |
|---|---|
| Size | 233.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
38b21a832e4165e5276a9d216b7573c42cebfd43d0f932ccb06c9d627d211db1
|
|
BLAKE2b-256 checksum How to use checksums |
238931c191e0c3743e642664e19acc040442b4e616c9fc5894ccd776d3823129
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|
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 Feb 7, 2025.
Transparency log