Извлечь определенные значения из netCDF

У меня есть файл netCDF с 3-мя размерами. Первое измерение - это долгота, и она составляет от 1 до 464. Второе измерение - это широта, и она составляет от 1 до 201. Третье измерение - это время, оно начинается с 1-5479.

Теперь я хочу извлечь из файла определенные значения. Я думаю, что с этим можно справиться с помощью аргумента запуска. Я пробовал эту команду.

test = open.ncdf("rr_0.25deg_reg_1980-1994_v8.0.nc")

data = get.var.ncdf(test,start=c(1:464,1:201,1:365))

Но как-то не получается. Есть у кого-нибудь решение?

Заранее спасибо...


person burton030    schedule 11.07.2013    source источник


Ответы (2)


Похоже, вы используете пакет ncdf в R. Если можете, я рекомендую использовать обновленный пакет ncdf4, который основан на библиотеке Unidata netcdf версии 4 (ссылка).

Вернемся к твоей проблеме. Я использую пакет ncdf4, но думаю, что пакет ncdf работает точно так же. Когда вы вызываете функцию get.var.ncdf, вам также необходимо явно указать имя переменной, которую вы хотите извлечь. Я думаю, вы можете получить имена переменных, используя names(test$var).

Итак, вам нужно сделать что-то вроде этого:

# Open the nc file
test = open.ncdf("rr_0.25deg_reg_1980-1994_v8.0.nc")

# Now get the names of the variables in the nc file
names(test$var)

# Get the data from the first variable listed above
# (May not fit in memory)
data = get.var.ncdf(test,varid=names(test$var)[1])

# If you only want a certain range of data. 
# The following will probably not fit in memory either
# data = get.var.ncdf(test,varid=names(test$var)[1])[1:464,1:201,1:365]

Для вашей проблемы вам нужно будет заменить varid=names(test$var)[1] выше на varid='VARIABLE_NAME', где VARIABLE_NAME - это переменная, которую вы хотите извлечь.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ:

Я установил пакет ncdf в свою систему, и приведенный выше код мне подходит!

person ialm    schedule 11.07.2013
comment
Хм, там написано имя моей переменной rr. Я поместил это в команду, подобную этой: data = get.var.ncdf (test, varid = rr (test $ var) [1]) [1: 464,1: 201,1: 365] Но это не работает. Я тупой? - person burton030; 11.07.2013
comment
Извините, мой код, должно быть, немного запутал - вам не нужна (test$var)[1] часть! Попробуйте это: get.var.ncdf(test,varid="rr")[1:464,1:201,1:365] - person ialm; 11.07.2013
comment
Кроме того, я рекомендую вам сначала попробовать get.var.ncdf(test,varid="rr") без части [1:464,1:201,1:365], чтобы убедиться, что ваши размеры ([долгота, широта, время]) верны! - person ialm; 11.07.2013
comment
Эта команда не работает: get.var.ncdf (test, varid = rr) Именно поэтому я пробую все эти вещи, потому что, когда я пытаюсь получить все данные, у меня заканчивается память. А также, если я попробую эту команду get.var.ncdf (test, varid = rr) [1: 464,1: 201,1: 365], у меня заканчивается память. Странно ... Может еще что-нибудь спрошу ... - person burton030; 11.07.2013
comment
Хорошо, я попробовал это с другим файлом, и он работал нормально. Похоже, мой файл имеет большой размер 947 МБ. Есть ли у вас другие предложения? - person burton030; 11.07.2013
comment
Извините, моя ошибка, я не обратил внимание на размер считываемого массива. Если вы читаете конец help(get.var.ncdf), есть пример чтения данных по одному временному шагу за раз, который должен оказаться полезно для вас. - person ialm; 11.07.2013

Вы также можете извлекать временные интервалы / даты и местоположения за пределами R, прежде чем считывать их в R для построения графика и т. Д., Используя CDO. Это имеет то преимущество, что вы можете работать непосредственно в координатном пространстве и напрямую указывать временные интервалы или даты:

e.g.

cdo seldate,20100101,20121031 in.nc out.nc
cdo sellonlatbox,lon1,lon2,lat1,lat2 in.nc out.nc
person Adrian Tompkins    schedule 05.11.2017