Link Search Menu Expand Document

2個nc檔案間的差值

Table of contents

背景

  • 執行2個netCDF檔案的相減,在空品模式分析過程中算是經常會遇到。
  • 套件方案
    • 雖然NCO程式包中有個小工具ncap2可以執行4則運算,但需要每個變數一一指定(ncap2 -s "T2=T*T" in.nc out.nc),那可不是一件小事了(也許shk.cs後的9~12個變數可以使用一下)。
    • CDOCF格式檔案也有其方便性,可以將所有變數一次計算。但畢竟ioapi格式與CF格式還是差異蠻大的,尤其是TFLAG相減為0後,檔案將失去其時間標籤了。
    • ncdiff -x -v TFLAG不會執行TFLAG的相減,也似乎一樣效果,因為結果檔案根本不存在TFLAG。
    • 應用GUI程式:如廣告,需要上、下載檔案到微軟平台上作業。
  • 最單純的方式,似乎是自己寫一支小程式來計算

Coding

#!/opt/ohpc/Taiwania3/pkg/local/python/3.9.7/bin/python3
import numpy as np
import netCDF4
import os,sys,datetime
fname=[sys.argv[i+1] for i in range(3)]
rw=['r','r','r+']
nc0=netCDF4.Dataset(fname[0],rw[0])
V=[list(filter(lambda x:nc0.variables[x].ndim==j, [i for i in nc0.variables])) for j in [1,2,3,4]]
nt0,nlay,nrow,ncol=nc0.variables[V[3][0]].shape
nc1=netCDF4.Dataset(fname[1],rw[1])
#V=[list(filter(lambda x:nc1.variables[x].ndim==j, [i for i in nc1.variables])) for j in [1,2,3,4]]
nt1,nlay,nrow,ncol=nc1.variables[V[3][0]].shape
if nt1<nt0: fname[0]=fname[1]
os.system('cp '+fname[0]+' '+fname[2])
nc2=netCDF4.Dataset(fname[2],rw[2])
v4=V[3]
nt=min(nt1,nt0)
for v in v4:
  nc2[v][:,:,:,:]=nc0[v][:nt,:,:,:]-nc1[v][:nt,:,:,:]
nc2.close()

Reference