xarray 提供了一个网格化数据的接口(如您所见in the documentation)。
我使用包cfgrib 来访问GRIB 数据。它是由 ECMWF (https://github.com/ecmwf/cfgrib) 开发的。
所以,如果你这样做:
import xarray as xr
d = xr.open_dataset('gefs.wave.t00z.c00.global.0p25.f000.grib2', engine = 'cfgrib')
print(d)
你明白了:
<xarray.Dataset>
Dimensions: (latitude: 721, level: 3, longitude: 1440)
Coordinates:
time datetime64[ns] 2020-12-01
step timedelta64[ns] 00:00:00
surface int32 1
* latitude (latitude) float64 90.0 89.75 89.5 89.25 ... -89.5 -89.75 -90.0
* longitude (longitude) float64 0.0 0.25 0.5 0.75 ... 359.3 359.5 359.8
valid_time datetime64[ns] 2020-12-01
* level (level) int32 1 2 3
Data variables:
ws (latitude, longitude) float32 nan nan nan nan ... nan nan nan
wdir (latitude, longitude) float32 ...
u (latitude, longitude) float32 ...
v (latitude, longitude) float32 ...
siconc (latitude, longitude) float32 ...
swh (latitude, longitude) float32 ...
paramId_0 (latitude, longitude) float32 ...
mwp (latitude, longitude) float32 ...
perpw (latitude, longitude) float32 ...
mwd (latitude, longitude) float32 ...
dirpw (latitude, longitude) float32 ...
shww (latitude, longitude) float32 ...
swell (level, latitude, longitude) float32 ...
mpww (latitude, longitude) float32 ...
swper (level, latitude, longitude) float32 ...
wvdir (latitude, longitude) float32 ...
swdir (level, latitude, longitude) float32 ...
Attributes:
GRIB_edition: 2
GRIB_centre: kwbc
GRIB_centreDescription: US National Weather Service - NCEP
GRIB_subCentre: 0
Conventions: CF-1.7
institution: US National Weather Service - NCEP
history: 2021-02-23T16:14:32 GRIB to CDM+CF via cfgrib-0....
每个数据变量都有自己的坐标,可以通过xarray访问:
print(d['swh'])
<xarray.DataArray 'swh' (latitude: 721, longitude: 1440)>
array([[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]], dtype=float32)
Coordinates:
time datetime64[ns] 2020-12-01
step timedelta64[ns] 00:00:00
surface int32 1
* latitude (latitude) float64 90.0 89.75 89.5 89.25 ... -89.5 -89.75 -90.0
* longitude (longitude) float64 0.0 0.25 0.5 0.75 ... 359.3 359.5 359.8
valid_time datetime64[ns] 2020-12-01
Attributes:
GRIB_paramId: 140229
GRIB_shortName: swh
GRIB_units: m
GRIB_name: Significant height of combined ...
GRIB_cfVarName: swh
GRIB_dataType: an
GRIB_missingValue: 9999
GRIB_numberOfPoints: 1038240
GRIB_typeOfLevel: surface
GRIB_NV: 0
GRIB_stepUnits: 1
GRIB_stepType: instant
GRIB_gridType: regular_ll
GRIB_gridDefinitionDescription: Latitude/longitude. Also called...
GRIB_Nx: 1440
GRIB_iDirectionIncrementInDegrees: 0.25
GRIB_iScansNegatively: 0
GRIB_longitudeOfFirstGridPointInDegrees: 0.0
GRIB_longitudeOfLastGridPointInDegrees: 359.750016
GRIB_Ny: 721
GRIB_jDirectionIncrementInDegrees: 0.25
GRIB_jPointsAreConsecutive: 0
GRIB_jScansPositively: 0
GRIB_latitudeOfFirstGridPointInDegrees: 90.0
GRIB_latitudeOfLastGridPointInDegrees: -90.0
long_name: Significant height of combined ...
units: m
变量是DataArray,但您可以使用values 访问底层网格数据,因此:
d['swh'].values
array([[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
...,
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan],
[nan, nan, nan, ..., nan, nan, nan]], dtype=float32)
或使用to_* 函数导出,例如导出到 Pandas DataFrame:
print(d['swh'].to_dataframe().head())
time step surface valid_time swh
latitude longitude
90.0 0.00 2020-12-01 0 days 1 2020-12-01 NaN
0.25 2020-12-01 0 days 1 2020-12-01 NaN
0.50 2020-12-01 0 days 1 2020-12-01 NaN
0.75 2020-12-01 0 days 1 2020-12-01 NaN
1.00 2020-12-01 0 days 1 2020-12-01 NaN