如何为NOAA VHP系列nc文件添加time、lat、lon缺失维度
解决步骤
1. 权限报错原因与修复
你使用'w'模式打开现有NC文件属于错误操作:该模式会直接清空原有文件内容创建新文件,触发Permission denied报错的常见原因有两个:
- 原文件被Panoply、其他Python进程等程序占用锁定
- 当前Windows账户对
D:\x02ND_ARTICLE_II\trials\路径没有写入权限,或原文件属性被设为只读
正确的可读写打开现有NC文件的模式为'r+',该模式支持修改且不会清空原有数据,操作前建议先复制原文件做备份,避免操作失误丢失数据。
2. 补充缺失维度的完整操作流程
操作前需提前确认两点:NOAA官方给出的该套VHP产品的投影、经纬度范围参数,以及从文件名提取的时间戳(文件名中P1981035代表1981年第35天,对应3周合成的时间节点)。
from netCDF4 import Dataset import numpy as np # 用r+模式打开备份后的NC文件 nc = Dataset('VHP.G04.C07.NC.P1981035.SM.nc', 'r+', format='NETCDF4') # 新增3个缺失维度 # 单时间步time维度长度设为1 nc.createDimension('time', 1) # HEIGHT对应纬度方向,长度为3616;WIDTH对应经度方向,长度为10000 nc.createDimension('lat', 3616) nc.createDimension('lon', 10000) # 给各维度创建变量并赋值 # time变量,单位可根据自己的使用习惯调整 time_var = nc.createVariable('time', 'f4', ('time',)) time_var.units = 'days since 1981-01-01 00:00:00' time_var[:] = 34 # 对应1981年第35天,从0计数即为34 # lat变量,需替换为你所持产品的官方纬度计算规则,示例为假设范围 lat_arr = np.linspace(75, -55, 3616) # 示例假设纬度范围为75°N~-55°N lat_var = nc.createVariable('lat', 'f4', ('lat',)) lat_var.units = 'degrees_north' lat_var[:] = lat_arr # lon变量,需替换为你所持产品的官方经度计算规则,示例为假设范围 lon_arr = np.linspace(-180, 180, 10000) # 示例假设经度范围为-180°E~180°E lon_var = nc.createVariable('lon', 'f4', ('lon',)) lon_var.units = 'degrees_east' lon_var[:] = lon_arr # 调整原有数据变量的维度关联,示例以植被健康指数变量VHI为例 # 读取原有数据 old_vhi = nc.variables['VHI'][:] # 重命名旧变量 nc.renameVariable('VHI', 'VHI_old') # 创建关联新维度的变量 new_vhi = nc.createVariable('VHI', 'f4', ('time', 'lat', 'lon')) # 写入原有数据,新增time维度轴 new_vhi[:] = old_vhi[np.newaxis, :, :] # 可选:删除旧变量节省存储空间 del nc.variables['VHI_old'] # 关闭文件保存修改 nc.close()
注意事项
- 经纬度的数值计算必须匹配你下载的NOAA VHP产品的官方投影参数,不要直接使用示例中的经纬度范围,避免坐标偏移
- 若原文件属性为只读无法修改,可新建一个NC文件,将原有数据、新增维度变量全部导入新文件,操作稳定性更高
- 若仍提示权限错误,右键点击目标文件夹选择「属性-安全」,给当前用户添加「完全控制」权限,同时关闭所有正在读取该NC文件的软件
内容的提问来源于stack exchange,提问作者DePius
相关产品推荐
相关产品推荐

