Unit Support

To ensure correct calculations, MetPy relies upon the 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.

Construction

To use units, the first step is to import the default MetPy units registry from the 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 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 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')

Operations

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

Conversion

Converting a Quantity between units can be accomplished by using the to() method call, which constructs a new Quantity in the desired units:

print((1 * units.inch).to(units.mm))
25.400000000000002 millimeter

There is also the ito() method which performs the same operation in place. To simplify units, there is also the 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

to_base_units() can also be done in place via the ito_base_units() method.