Xarray(从 grib 文件)到数据集
Xarray (from grib file) to dataset
我有一个包含 1989 年到 2018 年每月降水量和温度的 grib 文件(从 ERA5-Land 中提取)。
我需要这些数据采用 6 列的数据集格式:经度、纬度、grib 文件中 cell/point 的 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”。
温度变量分为两个 xarray,但我不明白为什么。
请问如何从中获取所需的数据集?
我是第一次处理这样的数据,我真的不知道如何处理。
这是经过反复试验后的答案(只给出了 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
here 的文档。您可能想使用 cfgrib.open_datasets
,但您也可以将 backend_kwargs
作为 kwargs 传递给 xarray 方法。
有时可以合并来自两个超立方体的变量,正如您似乎已经发现的那样。在更复杂的情况下,例如,当多个超立方体上有 data_vars 同名时,您将不得不进行一些手动干预才能合并数据集。
我有一个包含 1989 年到 2018 年每月降水量和温度的 grib 文件(从 ERA5-Land 中提取)。
我需要这些数据采用 6 列的数据集格式:经度、纬度、grib 文件中 cell/point 的 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”。 温度变量分为两个 xarray,但我不明白为什么。
请问如何从中获取所需的数据集?
我是第一次处理这样的数据,我真的不知道如何处理。
这是经过反复试验后的答案(只给出了 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
here 的文档。您可能想使用 cfgrib.open_datasets
,但您也可以将 backend_kwargs
作为 kwargs 传递给 xarray 方法。
有时可以合并来自两个超立方体的变量,正如您似乎已经发现的那样。在更复杂的情况下,例如,当多个超立方体上有 data_vars 同名时,您将不得不进行一些手动干预才能合并数据集。