Я использую цикл for в R, чтобы читать файл netCDF из папки и извлекать значения для данного списка долготы, широты. Это похоже на работу, кроме ОДНОЙ ПРОБЛЕМЫ. Когда цикл возвращает значения по дате, он создает 29-29 января после 28 февраля. Я хочу, как обычно, 01 марта после 28 или 29 февраля (для високосного года). Вот мой R код:Цикл через год, месяц, день для netCDF имя файла
# given latitude, longitude list
sb1 <- data.frame(longitude=1:10,latitude =1:10)
# Extracting zonal or sub-basin average rainfall from netCDF file
sb1_r <- c()
date <- c()
rain_month <- c()
rain_year <- c()
for (year in 1998:1998){
for (month in 1:3){
for (day in seq_along(1:31)){
FileName <- paste('3B42_daily',year,sprintf("%02d",month),sprintf("%02d", day),'7.SUB.nc', sep='.')
if (!file.exists(FileName)){
next
} else {
File <- nc_open(FileName)
rain <- ncvar_get(File, 'r')
sb1_r[day] <- mean(apply(sb1,1,function(x)rain[x[1],x[2]]),na.rm = TRUE)
date[day] <- paste(year,sprintf("%02d", month),sprintf("%02d", day),sep='-')
rain_month <- data.frame(date,sb1_r)
nc_close(File)
}
}
rain_year <- rbind(rain_year,rain_month)
}
}
Вы можете найти ежедневные данные NetCDF в течение трех месяцев по этой ссылке: https://drive.google.com/open?id=0B8rqKaYt0VEaMWVGc1gzdXI1U28
Вы 'для (день в seq_along (1:31))' за месяцы январь, февраль и март. Но в феврале всего 28 дней. Это может быть проблема? Если это так, вам нужно настроить цикл. – Gandalf
@ Gandalf Но у меня нет файлов NetCDF с именем 3B42_daily.1998.02.29.7.SUB и так далее. Чтобы этого избежать, я добавляю «if (! File.exists (FileName)) {« в свой код. –
Просто укажите, что использование средней функции не даст вам правильного ответа при использовании, например, регулярная сетка lat/lon, так как ячейки сетки различаются по размеру. Таким образом, значение в каждой ячейке должно быть взвешено по площади ячейки. Гораздо лучше просто использовать CDO, который учитывает это автоматически - см. Ниже. –