To ensure correct calculations, MetPy relies upon the :mod:`pint` library to enforce unit-correctness. This simplifies the MetPy API by eliminating the need to specify units various functions. Instead, only the final results need to be converted to desired units. For more information on unit support, see the documentation for Pint. Particular attention should be paid to the support for temperature units.
To use units, the first step is to import the default MetPy units registry from the :mod:`~metpy.units` module:
import numpy as np
from metpy.units import units
The unit registry encapsulates all of the available units, as well as any pertinent settings.
The registry also understands unit prefixes and suffixes; this allows the registry to
understand 'kilometer'
and 'meters'
in addition to the base 'meter'
unit.
In general, using units is only a small step on top of using the :class:`numpy.ndarray` object. The easiest way to attach units to an array is to multiply by the units:
distance = np.arange(1, 5) * units.meters
It is also possible to directly construct a :class:`pint.Quantity`, with a full units string:
time = units.Quantity(np.arange(2, 10, 2), 'sec')
Compound units can be constructed by the direct mathematical operations necessary:
g = 9.81 * units.meter / (units.second * units.second)
This verbose syntax can be reduced by using the unit registry's support for parsing units:
g = 9.81 * units('m/s^2')
With units attached, it is possible to perform mathematical operations, resulting in the proper units:
print(distance / time)
[ 0.5 0.5 0.5 0.5] meter / second
For multiplication and division, units can combine and cancel. For addition and subtraction, instead the operands must have compatible units. For instance, this works:
print(distance + distance)
[0 2 4 6 8] meter
But this does not:
print(distance + time)
DimensionalityError: Cannot convert from 'meter' ([length]) to 'second' ([time])
Even if the units are not identical, as long as they are dimensionally equivalent, the operation can be performed:
print(3 * units.inch + 5 * units.cm)
4.968503937007874 inch
Converting a :class:`~pint.Quantity` between units can be accomplished by using the :meth:`~pint.Quantity.to` method call, which constructs a new :class:`~pint.Quantity` in the desired units:
print((1 * units.inch).to(units.mm))
25.400000000000002 millimeter
There is also the :meth:`~pint.Quantity.ito` method which performs the same operation in place. To simplify units, there is also the :meth:`~pint.Quantity.to_base_units` method, which converts a quantity to SI units, performing any needed cancellation:
Lf = 3.34e6 * units('J/kg')
print(Lf, Lf.to_base_units(), sep='\n')
3340000.0 joule / kilogram 3340000.0 meter ** 2 / second ** 2
:meth:`~pint.Quantity.to_base_units` can also be done in place via the :meth:`~pint.Quantity.ito_base_units` method.