Xarray(从grib文件)到数据集



我有一个gridb文件,其中包含1989年至2018年的月降水量和温度(摘自ERA5 Land(。

我需要用6列的数据集格式来获取这些数据:经度、纬度、gridb文件中的单元格/点的ID、日期、温度和降水量。

我首先使用cfgrib导入该文件。以下是导入后包含的扩展数据列表:

import cfgrib
grib_data = cfgrib.open_datasets('era5land_extract.grib')
grib_data
Out[6]: 
[<xarray.Dataset>
Dimensions:     (latitude: 781, longitude: 761, time: 372)
Coordinates:
number      int32 0
* time        (time) datetime64[ns] 1989-01-01 1989-02-01 ... 2019-12-01
step        timedelta64[ns] 1 days
surface     float64 0.0
* latitude    (latitude) float64 42.0 41.9 41.8 41.7 ... -35.8 -35.9 -36.0
* longitude   (longitude) float64 -21.0 -20.9 -20.8 -20.7 ... 54.8 54.9 55.0
valid_time  (time) datetime64[ns] ...
Data variables:
t2m         (time, latitude, longitude) float32 ...
Attributes:
GRIB_edition:            1
GRIB_centre:             ecmf
GRIB_centreDescription:  European Centre for Medium-Range Weather Forecasts
GRIB_subCentre:          0
Conventions:             CF-1.7
institution:             European Centre for Medium-Range Weather Forecasts,
<xarray.Dataset>
Dimensions:     (latitude: 781, longitude: 761, time: 156)
Coordinates:
number      int32 0
* time        (time) datetime64[ns] 1989-01-01 1989-02-01 ... 2001-12-01
step        timedelta64[ns] 1 days
surface     float64 0.0
* latitude    (latitude) float64 42.0 41.9 41.8 41.7 ... -35.8 -35.9 -36.0
* longitude   (longitude) float64 -21.0 -20.9 -20.8 -20.7 ... 54.8 54.9 55.0
valid_time  (time) datetime64[ns] ...
Data variables:
tp          (time, latitude, longitude) float32 ...
Attributes:
GRIB_edition:            1
GRIB_centre:             ecmf
GRIB_centreDescription:  European Centre for Medium-Range Weather Forecasts
GRIB_subCentre:          0
Conventions:             CF-1.7
institution:             European Centre for Medium-Range Weather Forecasts,
<xarray.Dataset>
Dimensions:     (latitude: 781, longitude: 761, time: 216)
Coordinates:
number      int32 0
* time        (time) datetime64[ns] 2002-01-01 2002-02-01 ... 2019-12-01
step        timedelta64[ns] 1 days
surface     float64 0.0
* latitude    (latitude) float64 42.0 41.9 41.8 41.7 ... -35.8 -35.9 -36.0
* longitude   (longitude) float64 -21.0 -20.9 -20.8 -20.7 ... 54.8 54.9 55.0
valid_time  (time) datetime64[ns] ...
Data variables:
tp          (time, latitude, longitude) float32 ...
Attributes:
GRIB_edition:            1
GRIB_centre:             ecmf
GRIB_centreDescription:  European Centre for Medium-Range Weather Forecasts
GRIB_subCentre:          0
Conventions:             CF-1.7
institution:             European Centre for Medium-Range Weather Forecasts]

因此,温度变量被称为"温度";t2m";而降水量变量";tp";。温度变量被分成两个数组,但我不明白为什么。

我如何从中获得所需的数据集?

这是我第一次处理这样的数据,我真的不知道如何处理。

这是经过一点尝试和错误后的答案(只给出tp变量的结果,但与t2m类似(

import cfgrib
import xarray as xr

# Import data
grib_data = cfgrib.open_datasets('era5land_extract.grib')

# Merge both tp arrays into one on the time dimension
grib_precip = xr.merge([grib_data[1], grib_data[2]])

# Aggregate data by year
grib_precip_year = grib_precip.resample(time="Y", skipna=True).mean()

# Data from xarray to pandas
grib_precip_pd = grib_precip_year.to_dataframe()

最终得到两个xarray.Datasets的原因是因为这两个变量被映射到不同的"超立方体";。使用backend_kwargs = {'typeOfLevel': <level>}语法,一次只能打开一个。请参阅此处的cfgrib文档。您可能想要使用cfgrib.open_datasets,但也可以将backend_kwargs作为夸尔格传递给xarray方法。

有时可以合并来自两个超立方体的变量,正如您所发现的那样。在更复杂的情况下,例如,当多个超立方体上有同名的data_var时,您必须进行一些手动干预才能组合数据集。

相关内容

  • 没有找到相关文章

最新更新