Create meteorology data¶
Create MetDataset
and MetDataArray
data structures for working with meteorology data.
[1]:
from datetime import datetime
import numpy as np
import xarray as xr
from pycontrails import MetDataArray, MetDataset, MetVariable
MetDataArray¶
Thin wrapper around xr.DataArray
[2]:
rng = np.random.default_rng(seed=2020)
# construct an xarray DataArray with coordinate labels for data
da = xr.DataArray(
name="random",
data=rng.random((20, 15, 4, 5)),
dims=["longitude", "latitude", "level", "time"],
coords={
"longitude": np.arange(-100, -80, 1.0),
"latitude": np.arange(30, 45, 1.0),
"level": np.arange(100, 500, 100),
"time": [datetime(2021, 1, 1, h) for h in range(5)],
},
)
da
[2]:
<xarray.DataArray 'random' (longitude: 20, latitude: 15, level: 4, time: 5)> array([[[[4.68307543e-01, 5.14342231e-01, 8.63988281e-01, 7.19386871e-01, 3.33497882e-01], [8.81663616e-01, 5.18664864e-01, 5.23219417e-01, 7.22388696e-01, 4.46782561e-01], [8.50357081e-01, 6.83936263e-01, 6.65900069e-01, 9.46717074e-01, 7.53638850e-01], [9.17964165e-02, 8.26090137e-01, 5.55186777e-01, 2.31152608e-01, 9.82958913e-01]], [[5.84613086e-01, 4.26518507e-01, 8.45336094e-01, 5.07850470e-01, 7.10216629e-01], [1.37352673e-01, 4.84569777e-01, 8.89744202e-01, 9.52976849e-01, 3.76043941e-02], [9.54223457e-01, 8.98512171e-01, 4.14081276e-01, 4.20221061e-01, 6.91400341e-02], [4.21756867e-01, 4.93848391e-01, 1.51696284e-01, 9.41137061e-01, 1.88116189e-01]], [[1.90065507e-02, 9.44932088e-01, 9.93219943e-01, 6.81811974e-01, 7.84335294e-01], ... [8.92843751e-01, 4.07684237e-01, 3.05168469e-01, 1.73576037e-01, 3.34321840e-01]], [[7.61263799e-01, 9.91563651e-01, 9.47543921e-01, 6.68735461e-01, 2.71486792e-01], [2.05356394e-01, 7.42337468e-01, 2.70578729e-01, 7.15520327e-01, 7.30134504e-01], [6.68886804e-01, 5.15651993e-01, 8.40987212e-01, 5.37939968e-01, 3.71399439e-01], [1.67243220e-01, 9.76645528e-01, 3.08876242e-01, 8.19142068e-01, 9.69391866e-01]], [[4.44617360e-01, 5.02274334e-01, 2.32060554e-01, 3.54429329e-01, 1.36471633e-01], [6.30717612e-01, 2.40955809e-01, 2.54390888e-01, 7.20384123e-01, 3.42038201e-01], [8.20903975e-01, 6.73148542e-01, 8.67869039e-01, 4.79726457e-01, 8.34115517e-01], [3.59797874e-01, 7.61370564e-01, 4.16116300e-01, 7.46702020e-01, 6.39419576e-01]]]]) Coordinates: * longitude (longitude) float64 -100.0 -99.0 -98.0 ... -83.0 -82.0 -81.0 * latitude (latitude) float64 30.0 31.0 32.0 33.0 ... 41.0 42.0 43.0 44.0 * level (level) int64 100 200 300 400 * time (time) datetime64[ns] 2021-01-01 ... 2021-01-01T04:00:00
[3]:
met = MetDataArray(da)
met
[3]:
MetDataArray with data:
<xarray.DataArray 'random' (longitude: 20, latitude: 15, level: 4, time: 5)> array([[[[4.68307543e-01, 5.14342231e-01, 8.63988281e-01, 7.19386871e-01, 3.33497882e-01], [8.81663616e-01, 5.18664864e-01, 5.23219417e-01, 7.22388696e-01, 4.46782561e-01], [8.50357081e-01, 6.83936263e-01, 6.65900069e-01, 9.46717074e-01, 7.53638850e-01], [9.17964165e-02, 8.26090137e-01, 5.55186777e-01, 2.31152608e-01, 9.82958913e-01]], [[5.84613086e-01, 4.26518507e-01, 8.45336094e-01, 5.07850470e-01, 7.10216629e-01], [1.37352673e-01, 4.84569777e-01, 8.89744202e-01, 9.52976849e-01, 3.76043941e-02], [9.54223457e-01, 8.98512171e-01, 4.14081276e-01, 4.20221061e-01, 6.91400341e-02], [4.21756867e-01, 4.93848391e-01, 1.51696284e-01, 9.41137061e-01, 1.88116189e-01]], [[1.90065507e-02, 9.44932088e-01, 9.93219943e-01, 6.81811974e-01, 7.84335294e-01], ... [8.92843751e-01, 4.07684237e-01, 3.05168469e-01, 1.73576037e-01, 3.34321840e-01]], [[7.61263799e-01, 9.91563651e-01, 9.47543921e-01, 6.68735461e-01, 2.71486792e-01], [2.05356394e-01, 7.42337468e-01, 2.70578729e-01, 7.15520327e-01, 7.30134504e-01], [6.68886804e-01, 5.15651993e-01, 8.40987212e-01, 5.37939968e-01, 3.71399439e-01], [1.67243220e-01, 9.76645528e-01, 3.08876242e-01, 8.19142068e-01, 9.69391866e-01]], [[4.44617360e-01, 5.02274334e-01, 2.32060554e-01, 3.54429329e-01, 1.36471633e-01], [6.30717612e-01, 2.40955809e-01, 2.54390888e-01, 7.20384123e-01, 3.42038201e-01], [8.20903975e-01, 6.73148542e-01, 8.67869039e-01, 4.79726457e-01, 8.34115517e-01], [3.59797874e-01, 7.61370564e-01, 4.16116300e-01, 7.46702020e-01, 6.39419576e-01]]]]) Coordinates: * longitude (longitude) float64 -100.0 -99.0 -98.0 ... -83.0 -82.0 -81.0 * latitude (latitude) float64 30.0 31.0 32.0 33.0 ... 41.0 42.0 43.0 44.0 * level (level) float64 100.0 200.0 300.0 400.0 * time (time) datetime64[ns] 2021-01-01 ... 2021-01-01T04:00:00 air_pressure (level) float64 1e+04 2e+04 3e+04 4e+04 altitude (level) float64 1.618e+04 1.178e+04 9.164e+03 7.185e+03
[4]:
# data attribute contains copy of the original xr.DataArray
isinstance(met.data, xr.DataArray)
[4]:
True
[5]:
# broadcast coords to the DataArray
met.broadcast_coords("air_pressure")
[5]:
<xarray.DataArray 'air_pressure' (longitude: 20, latitude: 15, level: 4, time: 5)> array([[[[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], ..., [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], ... [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], ..., [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]]]]) Coordinates: * longitude (longitude) float64 -100.0 -99.0 -98.0 ... -83.0 -82.0 -81.0 * latitude (latitude) float64 30.0 31.0 32.0 33.0 ... 41.0 42.0 43.0 44.0 * level (level) float64 100.0 200.0 300.0 400.0 * time (time) datetime64[ns] 2021-01-01 ... 2021-01-01T04:00:00 air_pressure (level) float64 1e+04 2e+04 3e+04 4e+04 altitude (level) float64 1.618e+04 1.178e+04 9.164e+03 7.185e+03
MetDataset¶
Thin wrapper around xr.Dataset
[6]:
ds = xr.Dataset(
{
"random": (["longitude", "latitude", "level", "time"], rng.random((20, 15, 4, 5))),
"ones": (["longitude", "latitude", "level", "time"], np.ones((20, 15, 4, 5))),
},
coords={
"longitude": np.arange(-100, -80, 1.0),
"latitude": np.arange(30, 45, 1.0),
"level": np.arange(100, 500, 100),
"time": [datetime(2021, 1, 1, h) for h in range(5)],
},
)
[7]:
ds
[7]:
<xarray.Dataset> Dimensions: (longitude: 20, latitude: 15, level: 4, time: 5) Coordinates: * longitude (longitude) float64 -100.0 -99.0 -98.0 ... -83.0 -82.0 -81.0 * latitude (latitude) float64 30.0 31.0 32.0 33.0 ... 41.0 42.0 43.0 44.0 * level (level) int64 100 200 300 400 * time (time) datetime64[ns] 2021-01-01 ... 2021-01-01T04:00:00 Data variables: random (longitude, latitude, level, time) float64 0.08219 ... 0.3966 ones (longitude, latitude, level, time) float64 1.0 1.0 ... 1.0 1.0
[8]:
met = MetDataset(ds)
met
[8]:
MetDataset with data:
<xarray.Dataset> Dimensions: (longitude: 20, latitude: 15, level: 4, time: 5) Coordinates: * longitude (longitude) float64 -100.0 -99.0 -98.0 ... -83.0 -82.0 -81.0 * latitude (latitude) float64 30.0 31.0 32.0 33.0 ... 41.0 42.0 43.0 44.0 * level (level) float64 100.0 200.0 300.0 400.0 * time (time) datetime64[ns] 2021-01-01 ... 2021-01-01T04:00:00 air_pressure (level) float64 1e+04 2e+04 3e+04 4e+04 altitude (level) float64 1.618e+04 1.178e+04 9.164e+03 7.185e+03 Data variables: random (longitude, latitude, level, time) float64 0.08219 ... 0.3966 ones (longitude, latitude, level, time) float64 1.0 1.0 ... 1.0 1.0
[9]:
# broadcast coords to the DataArray
met.broadcast_coords("air_pressure")
[9]:
<xarray.DataArray 'air_pressure' (longitude: 20, latitude: 15, level: 4, time: 5)> array([[[[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], ..., [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], ... [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], ..., [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]], [[10000., 10000., 10000., 10000., 10000.], [20000., 20000., 20000., 20000., 20000.], [30000., 30000., 30000., 30000., 30000.], [40000., 40000., 40000., 40000., 40000.]]]]) Coordinates: * longitude (longitude) float64 -100.0 -99.0 -98.0 ... -83.0 -82.0 -81.0 * latitude (latitude) float64 30.0 31.0 32.0 33.0 ... 41.0 42.0 43.0 44.0 * level (level) float64 100.0 200.0 300.0 400.0 * time (time) datetime64[ns] 2021-01-01 ... 2021-01-01T04:00:00 air_pressure (level) float64 1e+04 2e+04 3e+04 4e+04 altitude (level) float64 1.618e+04 1.178e+04 9.164e+03 7.185e+03
MetVariable¶
Dataclass to contain metadata for meteorology variables.
[10]:
mv = MetVariable(short_name="mv", standard_name="met_variable", long_name="Custom Met Variable")
mv
[10]:
MetVariable(short_name='mv', standard_name='met_variable', long_name='Custom Met Variable', level_type=None, ecmwf_id=None, grib1_id=None, grib2_id=None, units=None, amip=None, description=None)
[11]:
# attrs shorthand
mv.attrs
[11]:
{'short_name': 'mv',
'standard_name': 'met_variable',
'long_name': 'Custom Met Variable'}
Built-in Variables¶
pycontrails
contains many standard met variables in the pycontrails.core.met_var
module.
The standard_name
attribute is used by default as string references through the repository.
[12]:
from pycontrails.core.met_var import (
AirTemperature,
SpecificHumidity,
)
[13]:
AirTemperature.attrs
[13]:
{'short_name': 't',
'standard_name': 'air_temperature',
'long_name': 'Air Temperature',
'units': 'K'}
[14]:
SpecificHumidity.attrs
[14]:
{'short_name': 'q',
'standard_name': 'specific_humidity',
'long_name': 'Specific Humidity',
'units': 'kg kg**-1'}