xarray重命名变量后写入netcdf时变量名变回旧名称问题
问题原因
- 核心原因是xarray的
rename_vars方法仅修改Dataset层面的变量名标识,不会同步更新对应变量编码(encoding)属性中的original_name字段。 - 调用
to_netcdf()写入netCDF文件时,底层写入逻辑会优先采用encoding中存储的原始变量名,最终导致写入后的文件变量名回退为旧名称。
解决方法
提供三种可直接落地的方案,任选其一即可:
方案1:重命名后删除对应变量的original_name编码属性
修改后的完整代码如下:
# rename and save files import glob import xarray as xr precip_files = glob.glob('/Volumes/Ext HDD 1/Python_data/crop_means/*tp*.nc') for i in precip_files: data = xr.open_dataset(i) data2 = data.rename_vars(name_dict={'tp_mean':'total_precip'}) # 清空重命名后变量的original_name编码属性,避免写入时回退 del data2['total_precip'].encoding['original_name'] save_path = '/Volumes/Ext HDD 1/Python_data/crop_means2/' + i.split('/')[-1].split('_')[0] + '_total_precip_mean.nc' data2.to_netcdf(save_path)
方案2:写入文件时通过encoding参数强制覆盖配置
不需要修改Dataset本身的属性,写入时直接指定变量编码即可:
# 调用to_netcdf时传入encoding参数 data2.to_netcdf(save_path, encoding={'total_precip': {'original_name': 'total_precip'}})
方案3:加载文件时禁用original_name记录
加载原始netCDF文件时添加mask_and_scale=False参数,从根源避免原始变量名被写入encoding:
# 加载阶段添加参数 data = xr.open_dataset(i, mask_and_scale=False)
内容的提问来源于stack exchange,提问作者Eli Turasky
相关产品推荐
相关产品推荐

