xarray创建带属性DataArray报错,如何合并数据集保存为NetCDF?
问题:将变量保存为NetCDF时出现
AttributeError: 'tuple' object has no attribute 'to_dataset'错误 操作步骤及出错代码
尝试将变量保存为NetCDF文件,执行以下步骤:
- 创建DataArray:
plev = xr.DataArray(plev,coords=[levels,lat,lon], dims=["lev","lat","lon"]) U_v32 = xr.DataArray(U_v32,coords=[levels,lat,lon], dims=["lev","lat","lon"]), attrs=dict(long_name = "eastward_wind" , standard_name = "eastward_wind" , units = "m s-1" , valid_range = "-1.e+15f, 1.e+15f" , vmax = "1.e+15f" , vmin = "-1.e+15f" , coordinates = "lon lat" ,)
- 将DataArray转为Dataset:
plev = plev.to_dataset(name="plev") U_v32 = U_v32.to_dataset(name = 'U') # 执行此代码时出错
- 合并数据集并保存:
data_v32 = xr.merge([U_v32,plev]) data_v32.to_netcdf(data_v32_final.nc4)
错误信息
AttributeError: 'tuple' object has no attribute 'to_dataset'
错误原因及解决方法
不是属性定义为字典导致的问题,而是创建U_v32的DataArray时,xr.DataArray()后面多了一个逗号,这使得U_v32被赋值成了一个包含DataArray和attrs字典的元组(tuple),而非单独的DataArray对象,自然没有to_dataset方法。
修正方法:把xr.DataArray()后面的逗号去掉,将attrs作为xr.DataArray的参数传入,正确的代码如下:
# 修正后的DataArray创建代码 plev = xr.DataArray(plev, coords=[levels, lat, lon], dims=["lev", "lat", "lon"]) U_v32 = xr.DataArray( U_v32, coords=[levels, lat, lon], dims=["lev", "lat", "lon"], attrs=dict( long_name="eastward_wind", standard_name="eastward_wind", units="m s-1", valid_range="-1.e+15f, 1.e+15f", vmax="1.e+15f", vmin="-1.e+15f", coordinates="lon lat" ) )
之后再执行转为Dataset、合并、保存的代码即可正常运行:
plev = plev.to_dataset(name="plev") U_v32 = U_v32.to_dataset(name='U') data_v32 = xr.merge([U_v32, plev]) data_v32.to_netcdf("data_v32_final.nc4") # 注意文件名需加引号,避免被识别为变量
内容的提问来源于stack exchange,提问作者nuvolet
相关产品推荐
相关产品推荐

