使用 CDO 仅提取特定区域的数据集
using CDO to extract dataset only for a specific region
我想使用 'cdo' 从南美洲的另一个 NetCDF 降水 NetCDF 数据集中提取数据。
我尝试了多个程序,但总是会出现一些错误(例如网格大小不相同、不支持的通用坐标等)。
我试过的代码:
cdo mul chirps_2000-2015_annual_SA.nc Extract feature.nc output.nc
# Got grid error
cdo -f nc4 setctomiss,0 -gtc,0 -remapcon,r1440x720 Chirps_2000-2015_annual_SA.nc CHIRPS_era5_pev_2000-2015_annual_SA_masked.nc
# Got unsupported generic error
我相信你可以 make/find 更优雅的解决方案,但我只是组合 Python
和 shell 可执行文件 cdo
来完成任务(可以考虑调用子进程作为一个坏习惯 sometimes/somewhere).
#!/usr/bin/env ipython
import numpy as np
from netCDF4 import Dataset
import subprocess
# -------------------------------------------------
def nc_varget(filein,varname):
ncin=Dataset(filein);
vardata=ncin.variables[varname][:];
ncin.close()
return vardata
# -------------------------------------------------
gridfile='extract_feature.nc'
inputfile='precipitation_2000-2015_annual_SA.nc'
outputfile='selected_region.nc'
# -------------------------------------------------
# Detect the start/end based on gridfile:
poutlon=nc_varget(gridfile,'lon')
poutlat=nc_varget(gridfile,'lat')
pinlon=nc_varget(inputfile,'lon')
pinlat=nc_varget(inputfile,'lat')
kkx=np.where((pinlon>=np.min(poutlon)) & (pinlon<=np.max(poutlon)))
kky=np.where((pinlat>=np.min(poutlat)) & (pinlat<=np.max(poutlat)))
# -------------------------------------------------
# -------------------------------------------------
commandstr='cdo selindexbox,'+str(np.min(kkx))+','+str(np.max(kkx))+','+str(np.min(kky))+','+str(np.max(kky))+' '+inputfile+' '+outputfile
subprocess.call(commandstr,shell=True)
您的数据中的问题是文件 "precipitation_2000-2015_annual_SA.nc" 目前没有指定网格 - 变量 lon、lat 是通用的,因此网格是通用的。否则,您可以使用其他运算符代替 selindexbox
。文件 extract_feature.nc
更接近标准,因为变量 lon、lat 也有名称和单位属性。
我想使用 'cdo' 从南美洲的另一个 NetCDF 降水 NetCDF 数据集中提取数据。 我尝试了多个程序,但总是会出现一些错误(例如网格大小不相同、不支持的通用坐标等)。
我试过的代码:
cdo mul chirps_2000-2015_annual_SA.nc Extract feature.nc output.nc
# Got grid error
cdo -f nc4 setctomiss,0 -gtc,0 -remapcon,r1440x720 Chirps_2000-2015_annual_SA.nc CHIRPS_era5_pev_2000-2015_annual_SA_masked.nc
# Got unsupported generic error
我相信你可以 make/find 更优雅的解决方案,但我只是组合 Python
和 shell 可执行文件 cdo
来完成任务(可以考虑调用子进程作为一个坏习惯 sometimes/somewhere).
#!/usr/bin/env ipython
import numpy as np
from netCDF4 import Dataset
import subprocess
# -------------------------------------------------
def nc_varget(filein,varname):
ncin=Dataset(filein);
vardata=ncin.variables[varname][:];
ncin.close()
return vardata
# -------------------------------------------------
gridfile='extract_feature.nc'
inputfile='precipitation_2000-2015_annual_SA.nc'
outputfile='selected_region.nc'
# -------------------------------------------------
# Detect the start/end based on gridfile:
poutlon=nc_varget(gridfile,'lon')
poutlat=nc_varget(gridfile,'lat')
pinlon=nc_varget(inputfile,'lon')
pinlat=nc_varget(inputfile,'lat')
kkx=np.where((pinlon>=np.min(poutlon)) & (pinlon<=np.max(poutlon)))
kky=np.where((pinlat>=np.min(poutlat)) & (pinlat<=np.max(poutlat)))
# -------------------------------------------------
# -------------------------------------------------
commandstr='cdo selindexbox,'+str(np.min(kkx))+','+str(np.max(kkx))+','+str(np.min(kky))+','+str(np.max(kky))+' '+inputfile+' '+outputfile
subprocess.call(commandstr,shell=True)
您的数据中的问题是文件 "precipitation_2000-2015_annual_SA.nc" 目前没有指定网格 - 变量 lon、lat 是通用的,因此网格是通用的。否则,您可以使用其他运算符代替 selindexbox
。文件 extract_feature.nc
更接近标准,因为变量 lon、lat 也有名称和单位属性。