Xarray engine: 2D wave spectra dimensions¶
This notebook demonstrates how earthkit-data manages parameters related to 2D wave spectra.
[1]:
import earthkit.data as ekd
We analyse a 2D wave spectra product at 2025-12-15 00 UTC and 03 UTC.
A specific feature of this dataset is that the fields are additionally indexed by
parameter.wave_directionparameter.wave_frequency
[2]:
fl = ekd.from_source("sample", "2d-wave-spectra_an.grib").to_fieldlist()
[3]:
fl.ls(extra_keys=["parameter.wave_direction", "parameter.wave_frequency"]).iloc[[0, 1, -2, -1]]
[3]:
| parameter.variable | time.valid_datetime | time.base_datetime | time.step | vertical.level | vertical.level_type | ensemble.member | geography.grid_type | parameter.wave_direction | parameter.wave_frequency | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2dfd | 2025-12-15 00:00:00 | 2025-12-15 00:00:00 | 0 days | 0 | mean_sea | 0 | regular_ll | 5.0 | 0.034523 |
| 1 | 2dfd | 2025-12-15 00:00:00 | 2025-12-15 00:00:00 | 0 days | 0 | mean_sea | 0 | regular_ll | 15.0 | 0.034523 |
| 2086 | 2dfd | 2025-12-15 03:00:00 | 2025-12-15 03:00:00 | 0 days | 0 | mean_sea | 0 | regular_ll | 345.0 | 0.497852 |
| 2087 | 2dfd | 2025-12-15 03:00:00 | 2025-12-15 03:00:00 | 0 days | 0 | mean_sea | 0 | regular_ll | 355.0 | 0.497852 |
[4]:
fl[0]
[4]:
Field
| number_of_values | 84 |
| array_type | ndarray |
| array_dtype | float64 |
| variable | 2dfd |
| standard_name | unknown |
| long_name | 2D wave spectra (single) |
| units | meter ** 2 * second / radian |
| wave_direction | 5.0 |
| wave_direction_index | 0 |
| wave_direction_bounds | (0.0, 10.0) |
| wave_direction_units | degree |
| wave_frequency | 0.034523 |
| wave_frequency_index | 0 |
| wave_frequency_bounds | (0.032917, 0.036208) |
| wave_frequency_units | 1 / second |
| valid_datetime | 2025-12-15 00:00:00 |
| base_datetime | 2025-12-15 00:00:00 |
| step | 0:00:00 |
| level | 0 |
| layer | None |
| level_type | mean_sea |
| member | 0 |
| grid_spec | None |
| grid_type | regular_ll |
| shape | (7, 12) |
| area | (90.0, 0.0, -90.0, 330.0) |
Conversion to Xarray is straightforward:
[5]:
ds = fl.to_xarray()
ds
[5]:
<xarray.Dataset> Size: 1MB
Dimensions: (wave_direction: 36, wave_frequency: 29,
forecast_reference_time: 2, latitude: 7,
longitude: 12)
Coordinates:
* wave_direction (wave_direction) float64 288B 5.0 15.0 ... 355.0
* wave_frequency (wave_frequency) float64 232B 0.03452 ... 0.4979
* forecast_reference_time (forecast_reference_time) datetime64[ns] 16B 202...
* latitude (latitude) float64 56B 90.0 60.0 ... -60.0 -90.0
* longitude (longitude) float64 96B 0.0 30.0 ... 300.0 330.0
Data variables:
2dfd (wave_direction, wave_frequency, forecast_reference_time, latitude, longitude) float64 1MB ...
Attributes:
Conventions: CF-1.8
institution: ECMWF