J'utilise une boucle for dans R pour lire le fichier netCDF d'un dossier et extraire des valeurs pour une liste donnée de longitude, latitude. Cela ressemble à travailler, sauf UN PROBLÈME. Lorsque la boucle renvoie des valeurs par rapport à la date, elle crée du 29 au 31 janvier après le 28 février. Je veux, comme d'habitude, le 01 mars après le 28 ou 29 février (pour les années bissextiles). Voici mon code R:Boucle passant par l'année, le mois, le jour pour le nom de fichier 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)
}
}
Vous pouvez trouver des données netCDF par jour pendant trois mois à ce lien: https://drive.google.com/open?id=0B8rqKaYt0VEaMWVGc1gzdXI1U28
Vous avez 'pour (jour seq_along (01h31))' pour les mois de Janvier, Février et Mars. Mais, Février a seulement 28 jours. Est-ce que ceci pourrait être le problème? Si c'est le cas, vous devez personnaliser la boucle. – Gandalf
@Gandalf Mais je n'ai pas de fichiers NetCDF avec le nom 3B42_daily.1998.02.29.7.SUB et ainsi de suite. Pour éviter cela, je mets "if (! File.exists (FileName)) {" dans mon code. –
Juste pour souligner que l'utilisation de la fonction moyenne ne vous donnera pas la réponse correcte lors de l'utilisation d'un e. grille de latitude/longitude régulière, puisque les cellules de la grille varient en taille. Ainsi, la valeur dans chaque cellule doit être pondérée par la zone de cellule. Il vaut mieux utiliser simplement CDO qui en tient compte automatiquement - voir ci-dessous. –