Xarray (из файла grib) в набор данных
У меня есть файл в грибе, содержащий месячные осадки и температуру с 1989 по 2018 год (извлечены из ERA5-Land).
Мне нужны эти данные в формате набора данных с 6 столбцами: долгота, широта, идентификатор ячейки / точки в файле grib, дата, температура и осадки.
Сначала я импортировал файл с помощью cfgrib. Вот что содержит список xdata после импорта:
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». Температурная переменная разделена на два xarrays, но я не понимаю почему.
Как я могу получить из этого необходимый набор данных?
Я впервые имею дело с такими данными, и я действительно не знаю, что делать дальше.
2 ответа
Вот ответ после небольшого количества проб и ошибок (результат помещается только для переменной 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
как kwargs для методов xarray.
Иногда можно объединить переменные из двух гиперкубов, как вы, кажется, нашли. В более сложных ситуациях, например, когда есть data_vars с одинаковым именем более чем в одном гиперкубе, вам придется выполнить некоторое ручное вмешательство, чтобы иметь возможность объединить наборы данных.