Mehrere netCDF files zusammenfuegen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PaulchenPanther
User
Beiträge: 16
Registriert: Freitag 13. Juli 2012, 17:17

Hallo zusammen,
kann mir bitte jemand bei folgendem Problem weiterhelfen.
Ich habe mehrere netCDF4 files in einem Ordner liegen. Es handelt sich dabei um "Tagesfiles".
Ich wuerde aus diesen Tagesfiles gerne eine grosse Datenstruktur machen.
Das habe ich bis jetzt als Skript zusammengebracht.

Code: Alles auswählen

import os
import netCDF4

i=0
MainFolder=r'/path/to/my/files/'

for (path, dirs, files) in os.walk(MainFolder):
    for ncfile in files:
        if ncfile[-3:] == '.nc':
		ncfile = os.path.join(path,ncfile)
		print ncfile
		ncfile = netCDF4.Dataset(ncfile, 'r')
		model_1 = ncfile.groups['model_1']
		temp = model_1.variables['temp']
                time = model_1.variables['time']
                ... 
		model_2 = ncfile.groups['model_2']
		pressure = model_2.variables['pressure'][:]
                ...
                ncfile.close()
Wie fuege ich die einzelnen Files sinnvoll zu einer grossen Datenstruktur zusammen.
Bisher habe ich sowas mit for-Schleifen und append() gemacht. Ich wuerde also fuer jeden einzelne Variable eine leere Liste definieren und dann beim Durchlaufen aller files jeweils mit append() die neuen Werte anhaengen.
Ist das der richtige Ansatz? Gibt es schoener Moeglichkeiten?

Danke vorab.
PaulchenPanther
User
Beiträge: 16
Registriert: Freitag 13. Juli 2012, 17:17

Ich bin inzwischen einen Schritt weiter. Statt append() benutze ich extend(). Damit funktioniert es nun einigermassen.
Ich frage mich aber, ob ich das nicht schoener hinkriegen kann, als ausserhalb der Schleife fuer jede einzelen Variable eine
leere Liste zu definieren und die dann innerhalb der Schleife zu fuellen. In meinem realen Datensatz habe ich zwei verschiedene 'groups' innerhalb der NetCDF-files
und in jeder der beiden Gruppen ca. 10 Variablen. Da definiere ich 20 leere Listen :( Das muss doch mit einer Funktion schoener gehen, nur wie?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@PaulchenPanther: Du würdest das natürlich nicht von Hand machen, sondern über ein Dictionary, defaultdict würde sich anbieten, das die leeren Listen dynamisch erzeugt.
BlackJack

@PaulchenPanther: Aus den Dateien wirst Du doch sehr wahrscheinlich `numpy`-Arrays lesen. Aus denen würde ich keine Listen machen sondern wieder Arrays. Das dürfte schneller und wahrscheinlich auch speicherschonender sein.

Als nächstes stellt sich die Frage ob Du das überhaupt alles im Arbeitsspeicher akkumulieren musst. Ich habe nicht so die Erfahrung mit netCDF, aber die neueste Version baut doch auf HDF5 auf und dort kann man Daten in der Datei um weitere Daten erweitern. Damit könnte es überflüssig werden alle Daten erst einmal komplett in den Arbeitsspeicher zu lesen.
PaulchenPanther
User
Beiträge: 16
Registriert: Freitag 13. Juli 2012, 17:17

Danke fuer euere beiden Antworten. Leider verstehe ich beide nicht so ganz.
@Sirius3: Ich werde mal probieren, ob ich das hinkriege. Aktuell weiss ich noch nicht genau, wo ich ansetzen muss. Danke aber trotzdem fuer den Tipp.
@BlackJack: Der Grund, wieso ich mit Listen arbeite, ist, dass ich die Funktion extend() benutzen moechte. Soweit ich verstanden habe, geht das nicht mit numpy-Arrays. Am Ende mache ich schon wieder Arrays draus. Das ist vielleicht nicht schoen. Funktioniert aber.
Beim zweiten Teil deiner Antwort gebe ich dir im Prinzip recht. Das klingt fuer mich als relativen Python-Anfaenger aber noch viel schwieriger. Aktuell ist die Anzahl and Einzelfiles und die darin enthaltene Datenmenge noch so ueberschaubar, dass meine unschoene Methode auch einigermassen klappt.
Antworten