Jahres-und Monatsmittelwerte einer 70-jährigen Zeitreihe
metronomy
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.10.2010, 11:59
Titel: Jahres-und Monatsmittelwerte einer 70-jährigen Zeitreihe
Ein freundliches Hallo an alle MATLAB-wissenden!
Ich möchte Jahres- bzw. Monatsmittelwerte einer etwa 70-jährigen Datenreihe, die auf Tagesmittelwerten basiert, errechnen. D.h. ich habe für jeden Tag einen Wert und möchte daraus die Mittelwerte errechnen. Im der txt.-file sind lediglich die Daten für jeden Tag enthalten kein Datumsvektor.
Ich hab mir folgende Gedanken drüber gemacht, wie man das am besten lösen könnte, habe aber keinerlei Planung wie ich es in Matlab umsetzen kann:
Letztendlich würde ich MAtlab einfach auffordern aller 365 bzw. 366 Tage einen Mittelwert zu errechnen und diesen dann in einem anderen Vektor auzugeben.
Das wäre das erst einmal fürs erste Jahr. Für die darauffolgenden ist es leider nicht ganz so einfach. Wie schreibe ich dann den zweiten Mittelwert an die stelle annual_mean=(2,1) und den dritten in die dritte Zeile usw.?
Probleme sind zudem für mich die Schaltjahre:die Reihe beginnt 1920 und endet 1990.
Um die Schaltjahre zu identifizieren hatte ich mir ne Funktion gebastelt, aber ich frage mich ob es nicht einfacher geht?! Ich will nur intern das Datum dazuerzeugen (eventuell mit Julian Day?) --> gibt es da eine Funktion die die fortlaufenden Tageszahlen ab einem bestimmten Datum ausgibt?
annual_mean = zeros(1, 70); % Pre-allocation!!!
index1 = 1;
index2 = Inf;
for i = 1:70 % Schaltjahr oder nicht: ifrem(1919 + i, 4)% Kein Gedöns zwischen 1920 und 1990
days = 365;
else
days = 366;
end
% Letzter Tag im Jahr:
index2 = index1 + days - 1;
Das geht zwar noch effizienter mit ACCUMARRAY und HISTC, wenn Du vorher die Jahreszahl mit DATEVEC und DATENUM als Vektor berechnest. Der Aufwand lohnt sich allerdings nicht: 10 Minuten mehr nachdenken und Programmieren, 10 Minuten länger debuggen, aber nur ein Paar Sekunden weniger Laufzeit.
Viel Erfolg, Jan
metronomy
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.10.2010, 14:55
Titel:
Hey Jan,
vielen vielen Dank für die schnelle Antwort! Das ist wirklich clever gemacht! DIese denkweise sollte ich mir übernehmen!
Noch eine kleine Frage: Was bedeutet INF? Und warum wird das als 'Startwert' genutzt? Ist das ähnlich dem NaN, oder?(Hab in der Hilfe schon mal gestöbert)
Wenn ich die ganze Sache noch auf Monatsmittelwerte runterschrauben möchte, müsste ich ähnlich vorgehen und in der for-schleife einhaken, oder?
Ich habe alle Monate mit einem Wert belegt (also jenachdem 31, 30 oder 28 bzw. 29 Tage)
Muss ich da noch zusätzlich einen index hinzufügen? Nicht nur einen, oder?!
Die Benutzung von HELP kann ich nur wärmstens empfehlen.
Ich hätte statt INF auch NaN, -1 oder Pi verwenden können.
Wie sinnvoll sind denn Monats-Durchschnitte, wenn ein Monat mal 28, ein anderer 31 Tage hat? Ein 30.4-Tages-Monat wäre physikalisch gesehen sinnvoller. Andernfalls landet man bei so schrägen Ergebnissen wie:
"Die Anzahl von Unfällen, die an einem Freitag den 13. passieren, ist höher als die Anzahl derer, die an einem Donnerstag den 13. passieren."
Und wieso ist das so? Es gibt einfach mehr Freitage als Donnerstage, die auf einen 13. eines Monats fallen.
Aber natürlich sieht man in tausenden von Statistiken Monatsdurchschnitte. Das würde ich dann auf alle Fälle DATEVEC überlassen:
Achtung: Bitte teste, ob vecDay die richtige Anzahl von Tagen hat. Eventuell gehen die Daten ja bis zum 01.01.1991!
Jetzt ist vecDay eine [#Tage x 6] Matrix mit den Jahreszahlen in der ersten und den Monatszahlen in der zweiten Spalte.
Einen Jahresdurchschnitt kann man nun so erhalten:
Und wenn Du dann noch die Monats-Mittelwerte für jedes Jahr erhalten möchtest, kannst Du das kombinieren:
Code:
m = zeros(1, 12 * 70);
k = 0;
for i = 1:70
matchYear = (vecDay(:, 1) == 1919 + i);
for j = 1:12
k = k + 1;
m(k) = mean(T(and(matchYear, vecDay(:, 2) == j)));
end end
Die Methode einen Vektor mit einem logischen Ausdruck zu indizieren heisst (ach was?!) "logical indexing". Sie ist im Allgemeinen viel schneller als die numerischen Indices zunächst per FIND zu berechnen. In der Dokumentation steht mehr dazu.
Gruß, Jan[/b]
metronomy
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 14.10.2010, 10:21
Titel:
Hey Jan!
Funktioniert wunderbar und bringt mir auch mal ein bisschen Licht ins Dunkel der Matlab-Vorgehensweise. Ich hätte es viel umständlicher und länger formuliert, aber du hast mir hier einen sehr praktischen Weg gezeigt wie es auch kürzer und genauso effektiv geht! DANKE!!!
EIn Problem hab ich noch mit dem Verstehen des logicsl indexing. Da werd ich mich aber ein bisschen belesen und nicht weiter deine Zeit in Anspruch nehemn.
für große Daten-Mengen (10e6) würde man das noch deutlich schneller und kompakterformulieren:
Die beiden Spalten für Jahr und Monat lassen sich zusammenfassen:
Jahr*100 + Monat.
Dann per ACCUMARRAY alle Zahlen zum gleichen JahrMonat-Index zusammen addieren und per HISTC die Zahl der jeweiligen Tage berechnen, zum Schluß beides dividieren.
Gruß, Jan
surfer
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.01.2012, 13:28
Titel:
Hallo...
hier möchte ich mich doch gleich nochmal einklinken. (Toller Ansatz da oben übrigens!)
Wie siehts denn aus wenn ich einen Mittelwert über eine bestimmte Zeitspanne erhalten möchte? Sagen wir 10 Jahre?!
Mir ist schon klar, warum da gemeckert wird. Man vergleicht ja 2 unterschiedliche Dinge. Aber wie löse ich das Problem?
Ich komm nicht drauf.
surfer
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 18.01.2012, 15:49
Titel:
Keiner eine Idee?
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.