我有一个NetCDF文件,并试图使用xarray读取一个变量(没有属性和坐标),然后给它分配新的属性和坐标。下面是我的python代码:
#--- 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文件中,tsk、xlat和xlon变量都具有相同的大小(2d数组)。现在tsk有属性,但仍然没有坐标。我做错了什么吗?没有错误。
发布于 2022-03-18 00:29:34
assign_coords不是就地操作。
来自xarray.DataArray.assign_coords文档:
除了新的坐标外,
还返回一个新对象,其中包含所有原始数据。
所以你需要:
tsk = tsk.assign_coords(lat=xlat, lon=xlon)发布于 2022-03-18 16:22:25
This answer是您所述问题的直接解决方案。
作为使用assign_coords的另一种方法,您所拥有的似乎是一个没有坐标(lat, lon)的维度数据集,而非索引坐标xlat (lat)和xlon (lon)给出了实际的lat/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发布于 2022-03-17 23:54:41
我认为你应该说tsk.wrfout_tsk_tavg是一个变量,它包含了lat和lon。从零开始创建dataset应该可以做到这一点:
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)))https://stackoverflow.com/questions/71520304
复制相似问题