Ich habe 73 netCDF-Dateien, die jeweils 5-Tages-Intervalle eines Kalenderjahres repräsentieren und mehrere Variablen haben. Jede Datei hat 120 Schichten, die stündliche Intervalle darstellen.Wie man eine Funktion mit einer spezifischen netCDF-Datei basierend auf dem Zeitstempel verbindet
Ich habe sie alle in R lesen und benannte sie in geeigneter Weise mit dem ncdf4
Paket wie folgt:
filenames <- list.files(path=getwd())
for(i in filenames) {
ncin <- nc_open(i)
ds<-paste(i)
assign(ds, ncin)
print(i)
}
ich auch einen Datenrahmen von Standorten in der gleichen Projektion wie die netCDF-Dateien haben (lat-lon) Allerdings erstrecken sich diese Standorte unregelmäßig auch über das gesamte Kalenderjahr. Eine Probe der Daten sieht wie folgt aus:
>head(df)
> Lon Lat datetime
2 -3.179046 58.65417 2016-09-30 17:25:38
3 -3.180403 58.65483 2016-09-30 17:29:43
4 -3.187734 58.66102 2016-09-30 21:22:51
5 -3.190197 58.66409 2016-09-30 22:02:47
6 -3.182058 58.67433 2016-10-01 06:16:08
7 -3.181318 58.67475 2016-10-01 06:20:31
Was ich versuche, ist also Datetime-Stempel auf der Grundlage zu tun ist, um den Daten-Rahmen auf die richtigen netCDF-Datei und Schicht übereinstimmen, wenn es zwischen Tag 1 und 5 das Jahr wäre netCDF Datei 1 usw .. dann möchte ich die variablen Daten aus der netCDF Datei auf die Standortdaten mit zugehörigem Datum-Zeit-Stempel des Datenrahmens interpolieren. Also zu der gegebenen Zeit und Stelle, die durch den Datenrahmen bereitgestellt wird, was ist der Wert der Variablen V zum selben Datum und derselben Zeit in der netCDF-Datei. Ich kann den ersten Teil mit Loop-Funktionen zu tun, aber es ist höchst ineffizient und zeitraubend Code:
function(dataframe){
d <- dataframe[i,]
if(between(d$datetime, 2017-01-01 00:00:00, 2017-01-05 23:59:59){ncfile <- file1} else if (between(d$datetime, 2017-01-06 00:00:00, 2017-01-010 23:59:59))
{ncfile <- file2}}
Und so weiter ... Da ich noch nie mit netCDF-Dateien gearbeitet, bevor ich in Bezug auf die beste Methode nicht sicher bin. Irgendwelche Vorschläge?
################# UPDATElas ich die netCDF-Dateien in mit
filenames <- list.files(path=getwd())
x <- lapply(filenames, nc_open)
Extrakt stammt aus der Datei, die nacheinander benannt sind:
PFOW_Climatology2_0001_1993-01-01.nc
PFOW_Climatology2_0002_1993-01-06.nc
bis zu
PFOW_Climatology2_0073_1993-12-27.nc
unter Verwendung
fd <- as.Date(substr(filenames, 24, 36))
ich das Intervall eine Referenzspalte für die Datenrahmen erstellen dann innerhalb derer von find9ing jeder Datenpunkt wie so in fd entspricht:
i <- findInterval(dd, fd)
df$file <- i
Vielen Dank @RobertH. Ich habe die Frage so geändert, dass sie mehr Informationen enthält und aktualisiert wurde, um die neuesten Vorschläge einzubeziehen, die Sie sehr hilfreich fanden. Ich konnte Ihre {what} Funktion nicht verwenden, also habe ich stattdessen 'findInterval' verwendet. –
Ich bin mir aber nicht sicher wie deine Funktion funktionieren soll. Wenn Sie versuchen, ein ncdf4-Objekt zu erstellen, erhalten Sie einen Fehler: 'eine geerbte Methode für die Funktion' raster 'für die Signatur konnte nicht gefunden werden' 'ncdf4' ' –
'brick' sollte für den Dateinamen verwendet werden, nicht für ein ncdf4-Objekt – RobertH