использование CDO для извлечения набора данных только для определенного региона - PullRequest
1 голос
/ 12 июня 2019

Я хочу использовать '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

Данные можно скачать по следующей ссылке .

1 Ответ

0 голосов
/ 18 июня 2019

Я уверен, что вы могли бы найти / найти более элегантное решение, но я просто скомбинировал Python и исполняемый файл оболочки cdo для выполнения задачи (вызов подпроцесса иногда может рассматриваться как дурная привычка где-то).

#!/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)

Проблема в ваших данных заключается в том, что файл "depositation_2000-2015_annual_SA.nc" на данный момент не указывает сетку - переменные lon, lat являются общими, и, следовательно, сетка является общей. В противном случае вы можете использовать другие операторы вместо selindexbox. Файл extract_feature.nc ближе к стандарту, поскольку переменные lon, lat имеют также атрибуты name и unit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...