Python创建netCDF文件时如何在循环中写入变量
问题排查与修复
你代码的问题共有3处,和你猜测的vname相关问题本质是变量覆盖问题,具体错误和修复方案如下:
错误点说明
- 笔误错误:你在数据生成阶段定义的变量存储列表命名为
vars,但循环遍历的对象写为var,少了末尾的s,会直接抛出变量未定义报错。另外不建议用vars作为自定义变量名,这是Python内置函数名,容易产生命名冲突。 - 维度参数错误:
createVariable方法的第三个参数要求传入维度名称组成的元组,你直接传入字符串'time'不符合参数要求,会导致维度定义失败。 - 变量覆盖错误:循环内部你将存储变量名字符串的
vname直接赋值为新创建的netCDF变量对象,后续执行data[vname]取值时,vname已经不是原本的字符串列名,无法匹配DataFrame的列名,导致取值失败。
修正后的循环代码
# 先把原来的变量列表改名避免和内置函数冲突 var_list = ['one', 'two', 'three', 'four'] # 循环写入逻辑修正 for vname in var_list: # 新创建的netCDF变量用单独变量存储,不要覆盖vname字符串 var_nc = ncfile.createVariable(vname, np.float64, ('time',)) var_nc[:] = data[vname].values # 所有变量写入完成后记得关闭文件 ncfile.close()
额外注意事项
你代码中提前定义了lat、lon两个维度但实际写入的变量都只关联time维度,如果你后续需要存储带经纬度信息的二维变量,记得调整createVariable的维度参数为('time', 'lat', 'lon'),同时对应调整写入的数组维度即可。
内容的提问来源于stack exchange,提问作者bikuser
相关产品推荐
相关产品推荐

