У меня есть файл NetCDF, и я пытаюсь использовать xarray для чтения переменной (без атрибутов и координат), а затем присваиваю ей новые атрибуты и координаты. Вот мой код на питоне:
#--- Import packages:
import numpy as np
import xarray as xr
#--- Read in data:
fin = xr.open_dataset("sample.nc")
tsk = fin.wrfout_tsk_tavg
xlat = fin.latitude
xlon = fin.longitude
#--- Setting new attributes and coordinates:
tsk.attrs['units'] = 'K'
tsk.assign_coords(lat=xlat, lon=xlon)
В файле NetCDF все переменные тск, xlat и xlon имеют одинаковый размер (массив 2d). Теперь у тск есть атрибуты, но по-прежнему нет координат. Я делаю что-то неправильно? Нет ошибки.
Я думаю, вы должны указать, что tsk.wrfout_tsk_tavg — это переменная с координатами широты и долготы. Создание набора данных с нуля должно помочь:
ds = xr.Dataset(
data_vars=dict(
wrfout_tsk_tavg=["lon", "lat"], fin.wrfout_tsk_tavg)),
coords=dict(lon=(["lon", "lat"], fin.longitude),
lat=(["lon", "lat"], fin.latitude)))
Этот ответ — прямое решение заявленной вами проблемы.
В качестве альтернативного подхода к использованию assign_coords - кажется, что у вас есть набор данных с измерениями без координат (lat, lon)
и без индексации координат xlat (lat)
и xlon (lon)
, дающих фактические значения широты и долготы. Это очень распространенная ситуация при чтении данных netCDF.
Я предполагаю, что ваши данные выглядят примерно так:
In [3]: ds = xr.Dataset(
...: {'wrfout_tsk_tavg': (('lat', 'lon'), np.random.random((4, 8)))},
...: coords = {
...: 'xlat': (('lat', ), np.arange(23, 27)),
...: 'xlon': (('lon', ), np.arange(-110, -102)),
...: },
...: )
In [4]: ds
Out[4]:
<xarray.Dataset>
Dimensions: (lat: 4, lon: 8)
Coordinates:
xlat (lat) int64 23 24 25 26
xlon (lon) int64 -110 -109 -108 -107 -106 -105 -104 -103
Dimensions without coordinates: lat, lon
Data variables:
wrfout_tsk_tavg (lat, lon) float64 0.4214 0.5839 0.6675 ... 0.4333 0.4409
Вы можете использовать xr.DataArray.swap_dims
или xr.Dataset.swap_dims
для переключения между индексируемыми и неиндексируемыми координатами с одинаковой размерностью. В твоем случае:
In [5]: ds = ds.swap_dims({"lat": "xlat", "lon": "xlon"})
...: ds
Out[5]:
<xarray.Dataset>
Dimensions: (xlat: 4, xlon: 8)
Coordinates:
* xlat (xlat) int64 23 24 25 26
* xlon (xlon) int64 -110 -109 -108 -107 -106 -105 -104 -103
Data variables:
wrfout_tsk_tavg (xlat, xlon) float64 0.4214 0.5839 0.6675 ... 0.4333 0.4409
пожалуйста, всегда печатайте свой набор данных, когда задаете вопрос - если возможно, предоставьте полный минимальный воспроизводимый пример, чтобы мы знали, что происходит с самого начала!