基于NCO/CDO提取求和NetCDF指定层并合并变量的技术问询
使用NCO实现NetCDF变量的维度合并与求和
这里有一套用NCO(NetCDF Operators)实现的简洁方案,完全匹配你的需求,全程不需要Python或R:
核心思路
我们会分三步完成:
- 从
PCT_CFT中提取指定cft层并分别求和 - 将求和结果转换为适配
PCT_NAT_PFT维度的格式 - 把新生成的两层合并到原始变量中
具体命令
1. 计算两个分组的求和结果
首先处理第一组(cft维度的3、4、61、62层,注意NCO用0-based索引,所以对应2,3,60,61):
ncwa -a cft -d cft,2,3 -d cft,60,61 -v PCT_CFT input.nc sum1.nc
-a cft:沿cft维度求和-d cft,X,Y:指定要包含的维度索引范围
然后处理第二组(剩余层:5-60、63、64层,对应0-based的4,59,62,63):
ncwa -a cft -d cft,4,59 -d cft,62,63 -v PCT_CFT input.nc sum2.nc
2. 转换求和结果的维度格式
我们需要把求和后仅含lat/lon维度的变量,扩展为包含natpft维度的格式,分别对应第15、16层(0-based索引14,15):
处理第一组求和结果:
ncks -O --mk_rec_dmn natpft -d natpft,14 sum1.nc sum1_exp.nc ncrename -v PCT_CFT,PCT_NAT_PFT sum1_exp.nc
--mk_rec_dmn natpft:添加natpft维度-d natpft,14:指定该维度的索引为14(对应第15层)ncrename:将变量名改为PCT_NAT_PFT以匹配原始变量
处理第二组求和结果:
ncks -O --mk_rec_dmn natpft -d natpft,15 sum2.nc sum2_exp.nc ncrename -v PCT_CFT,PCT_NAT_PFT sum2_exp.nc
3. 合并所有文件
最后把原始文件和两个扩展后的文件合并,完成PCT_NAT_PFT维度的扩展:
ncat -O input.nc sum1_exp.nc sum2_exp.nc output.nc
更简洁的无临时文件版本
如果不想生成中间文件,可以用bash进程替换直接完成所有操作:
ncat -O input.nc \ <(ncwa -a cft -d cft,2,3 -d cft,60,61 -v PCT_CFT input.nc | ncks --mk_rec_dmn natpft -d natpft,14 - | ncrename -v PCT_CFT,PCT_NAT_PFT -) \ <(ncwa -a cft -d cft,4,59 -d cft,62,63 -v PCT_CFT input.nc | ncks --mk_rec_dmn natpft -d natpft,15 - | ncrename -v PCT_CFT,PCT_NAT_PFT -) \ output.nc
验证结果
执行完命令后,可以用以下命令检查结果是否符合预期:
# 查看维度是否扩展为16 ncdump -h output.nc | grep "natpft" # 查看新添加的层数据 ncks -v PCT_NAT_PFT -d natpft,14 output.nc
注意事项
- 确保你的NCO版本支持进程替换(一般较新版本都支持),如果是旧版本,建议先升级NCO
- 确认原始
PCT_NAT_PFT的维度顺序是(natpft, lat, lon),和我们生成的扩展变量一致,否则合并会出错
内容的提问来源于stack exchange,提问作者Janina
相关产品推荐
相关产品推荐

