WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Wetterdaten Vergleichen

 

butschi
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2015, 13:05     Titel:
  Antworten mit Zitat      
Nun das einlesen funktioniert soweit und kann auf die einzelnen Spalten auch schön zugreifen, siehe code.

Spalte 2 ist ein Datumstempel der jeweiligen Wetterstation.
Spalte 6 ist die Temperatur der jeweiligen Wetterstation.

Anbei der Code:

Code:

% Einlesen der Wetterdaten
% Wetterstation 1

fileID = fopen('temperatur_station1','r');
formatSpec = '%f%f%f%f%f%f%f%s%[^\n\r]';
dataArray = textscan(fileID, formatSpec,'Delimiter', ';', 'HeaderLines', 1);

[data_datum data_temp] = dataArray{[2,6]};
daten_ws1 = [data_datum data_temp];

% Wetterstation 2

fileID = fopen('temperatur_station2.txt','r');
formatSpec = '%f%f%f%f%f%f%f%s%[^\n\r]';
dataArray = textscan(fileID, formatSpec,'Delimiter', ';', 'HeaderLines', 1);

[data_datum data_temp] = dataArray{[2,6]};
daten_ws2 = [data_datum data_temp];

 



Nun würde ich gerne die Daten der Wetterstationen miteinander vergleichen (konkret, wie hoch ist die Abweichung der Temperatur zwischen Wetterstation 1 und Wetterstation 2).

Hintergrund: Die Messwertzeitdaten sind verschieden, z.B.:

Von Wetterstation A liegen Daten von 2005-2013 vor und Wetterstation B liegen Daten von 2000-2012 vor. Manchmal fehlen Messzeitpunkte, da die Wetterstation nicht in Betrieb war.



Welchen Befehl oder Funktion gibt es, die einen solche Operation durchführ? Ich würde gerne auf for-schleifen oä. verzichten.

Wie würdet Ihr das Problem lösen?

Oder soll ich wie folgt vorgehen:

1. Dritte Matrix mit Zeitstempel erstellen. Länge und Werte werden aus (min/max) Berechnung der Wetterstation vorgegeben, aus obiges Beispiel von 2005-2012.

2. 1 Zeile von 2005-2012 in stündlicher Auflösung füllen.

3. zweite Spalte mit Wetterstation A und dritte Spalte mit Wetterstation B füllen (mit gültigem Zeitstempel).

Wie kann ein solcher Vergleich progammiert werden?

4. Abweichung berechnen

Vielen dank im Vorraus
Private Nachricht senden Benutzer-Profile anzeigen
Gesplittet: 04.05.2015, 13:28 Uhr von Winkow
Von Beitrag Wetterdaten einlesen vom DWD aus dem Forum Programmierung


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.05.2015, 13:30     Titel:
  Antworten mit Zitat      
hallo. bitte hänge keine neuen fragen an ein abgeschlossenes thema an. der beantwortet status wird dadurch hinfällig. wenn du auf etwas verweisen willst kannst du einfach einen link zur verfügung stellen.

Zitat:
Ich würde gerne auf for-schleifen oä. verzichten.
warum? kommt es bei deinem programm so sehr auf laufzeit an? werden die berechnungne sehr oft durchgeführt? oder verbrauchst du mehr zeit beim erdenken einer schnelleren lösung als du dadurch einspaarst? laufzeitoptimierung ist immer eine frage von aufwand und nutzen. außerdem sind for schleifen nicht immer langsamer dank jita.
Zitat:
1. Dritte Matrix mit Zeitstempel erstellen. Länge und Werte werden aus (min/max) Berechnung der Wetterstation vorgegeben, aus obiges Beispiel von 2005-2012.

2. 1 Zeile von 2005-2012 in stündlicher Auflösung füllen.

3. zweite Spalte mit Wetterstation A und dritte Spalte mit Wetterstation B füllen (mit gültigem Zeitstempel).

versteh ich nicht. ein kleines code beispiel ist da hilfreicher um zu sehen was du meinst.

guck dir mal
Code:
an. vieleicht hilft das oder die see also befehle.
sonst musst du nochmal genauer beschreiben was du vergleichen willst. zb
Zitat:
Von Wetterstation A liegen Daten von 2005-2013 vor und Wetterstation B liegen Daten von 2000-2012 vor. Manchmal fehlen Messzeitpunkte, da die Wetterstation nicht in Betrieb war.
was soll an den stellen passieren wo nur das ergebniss von einer station vorliegt?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
butschi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2015, 14:35     Titel:
  Antworten mit Zitat      
Danke für den Hinweis, ich wollte nicht zuviele Threads erstellen


Anbei ein Beispiel vom DWD:

ich würde als erstes gerne den Zeitstempel einlesen und ihn mittels Datenum verarbeiten.


Code:
fileID = fopen('Daten_Flachland\test.txt','r');
formatSpec = '%f%f%f%f%f%f%f%s%[^\n\r]';
dataArray = textscan(fileID, formatSpec,'Delimiter', ';', 'HeaderLines', 1);
[data_zeit, data_temp] = dataArray{[2,6]};
data_datum  = datenum(data_zeit,'yyyymmddHH')
daten_ws1 = [data_datum data_temp];


Bekomme aber jetzt schon den ersten Fehler:


"Error using datenum (line 178)
DATENUM failed.

Caused by:
Error using datenum (line 106)
The input to DATENUM was not an array of strings."

Gebe ich aber den Zeitstempel händisch ein, ist alles in Ordnung, siehe Beispiel:

data_datum = datenum('2010010100','yyyymmddHH')

Wo ist der Fehler?


Hab den Fehler gefunden:
Code:
data_datum  = datenum(num2str(data_zeit),'yyyymmddHH')


Werde nun eine dritte Matrix erstellen (als Referenzzeitstempel) und die Werte der Wetterstationen auf die Referenzliste übertragen. Falls der Wert nicht vorhanden ist, soll das Feld leer bleiben.

test.txt
 Beschreibung:

Download
 Dateiname:  test.txt
 Dateigröße:  320 Bytes
 Heruntergeladen:  336 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.05.2015, 15:33     Titel:
  Antworten mit Zitat      
du kannst sie auch gleich als string einlesen. dann musst du sie nicht konvertieren.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
butschi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2015, 16:31     Titel:
  Antworten mit Zitat      
Ganz geklappt hat das doch nicht, da die Stundenwerte mir Probleme bereiten:

data_datum = datenum(num2str(data_zeit),'yyyymmddHH');

liefert diese Ausgabe:

data_datum =

1.0e+05 *

7.341390000000000
7.341390416666666
7.341390833333334
7.341391250000000


Lasse ich die Stunden weg, dann funktioniert das, aber das ist nicht ausreichend.

Gibt es hierfür eine Lösung?

Vielen dank für die Hilfe
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.05.2015, 16:45     Titel:
  Antworten mit Zitat      
Zitat:
Gibt es hierfür eine Lösung?

für welches problem?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
butschi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2015, 22:34     Titel:
  Antworten mit Zitat      
Wenn ich die Stunden hinzubeziehe dann steigt die Zahl nicht mehr um den Wert 1, siehe Beispielergebnis. Lasse ich die Stunden weg, dann funktioniert alles prima. Ich benötige aber die Stunden...
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.05.2015, 07:49     Titel:
  Antworten mit Zitat      
Warum sollte der Wert wie bei Tagen auch um eins steigen? Dann wären ja Stunden und Tage identisch und man kann es nicht mehr auseinander halten. Der Wert steigt genau um 1/24. Das ist die Funktionsweise und auch sinnvoll. Wenn du etwas anderes willst musst du das nochmal erklären.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
butschi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2015, 13:19     Titel:
  Antworten mit Zitat      
danke, das hat mir geholfen...


Anbei mein aktueller Code:
Code:


% Wetterstation 1

fileID = fopen('Daten_Flachland\Meppen\temperatur.txt','r');
formatSpec = '%f%f%f%f%f%f%f%s%[^\n\r]';
dataArray = textscan(fileID, formatSpec,'Delimiter', ';', 'HeaderLines', 1);
[data_zeit, data_temp] = dataArray{[2,6]};
data_datum  = datenum(num2str(data_zeit),'yyyymmddHH')*24; % Stundenwerte als ganze Zahlen angeben
daten_ws1 = [data_datum data_temp];

% Wetterstation 2

fileID = fopen('Daten_Huegelig\Ofteringen\temperatur.txt','r');
formatSpec = '%f%f%f%f%f%f%f%s%[^\n\r]';
dataArray = textscan(fileID, formatSpec,'Delimiter', ';', 'HeaderLines', 1);
[data_zeit, data_temp] = dataArray{[2,6]};
data_datum  = datenum(num2str(data_zeit),'yyyymmddHH')*24; % Stundenwerte als ganze Zahlen angeben
daten_ws2 = [data_datum data_temp];

% Referenzliste erzeugen

startdatum(1,1)=min(daten_ws1(:,1));
startdatum(2,1)=min(daten_ws2(:,1));

enddatum(1,1)=max(daten_ws1(:,1));
enddatum(2,1)=max(daten_ws2(:,1));

laenge=min(enddatum)-max(startdatum);

ks = linspace(max(startdatum),min(enddatum),laenge+1);
ks = ks.';
 


nun würde ich gerne als nächstes zu den jeweiligen Zeitstempeln die Temperaturwerte ablegen (wenn vorhanden)?

Mit der Funktion intersect komm ich nicht weiter, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.05.2015, 13:39     Titel:
  Antworten mit Zitat      
warum multiplizierst du alles mit 24 ? damit machst du aus vernüftigen daten komische daten die sich so nicht mehr ordentlich druch datestr wieder zurück rechnen lassen. ich versteh den sinn dahinter nicht... aber egal
Zitat:
Mit der Funktion intersect komm ich nicht weiter, oder?

hmm denkst du ich hab den befehl nur als beispiel gegeben um dich zu verwirren? Smile
Code:
x1=[1 2 3 4];
y1=[5 6 7 8];
x2=[2 3 4 5];
y2=[11 12 13 14];
[C,ia,ib] = intersect(x1,x2)
D=[C',y1(ia)',y2(ib)']
ich denke intersect löst dein problem ohne die erzeugung einer "referenzliste" was auch immer das bewirken soll ^^
p.s. der bbcode muss im post aktiviert sein damit die code umgebung funktioniert.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
butschi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2015, 14:06     Titel:
  Antworten mit Zitat      
Au mann... danke, das läuft soweit.

Anbei der Code:


Code:

% Einlesen der Wetterdaten

% Wetterstation 1

fileID = fopen('Daten_Flachland\Meppen\temperatur.txt','r');
formatSpec = '%f%f%f%f%f%f%f%s%[^\n\r]';
dataArray = textscan(fileID, formatSpec,'Delimiter', ';', 'HeaderLines', 1);
[data_zeit, data_temp_ws1] = dataArray{[2,6]};
data_datum_ws1  = datenum(num2str(data_zeit),'yyyymmddHH');
daten_ws1 = [data_datum_ws1 data_temp_ws1];

% Wetterstation 2

fileID = fopen('Daten_Huegelig\Ofteringen\temperatur.txt','r');
formatSpec = '%f%f%f%f%f%f%f%s%[^\n\r]';
dataArray = textscan(fileID, formatSpec,'Delimiter', ';', 'HeaderLines', 1);
[data_zeit, data_temp_ws2] = dataArray{[2,6]};
data_datum_ws2  = datenum(num2str(data_zeit),'yyyymmddHH');
daten_ws2 = [data_datum_ws2 data_temp_ws2];

% Werte in einer Liste eintragen

x1=data_datum_ws1.';
y1=data_temp_ws1.';
x2=data_datum_ws2.';
y2=data_temp_ws2.';
[C,ia,ib] = intersect(x1,x2);
D=[C',y1(ia)',y2(ib)'];

 



Ich hab jetzt aber ein neues Problem. Bei den Daten (Wetterdaten vom DWD (öffentlich zugänglich)) sind manche Messwerte Fehlerhaft, diese werden mit dem Wert -999 belegt, siehe temperatur_meppen.txt. Diese müssen im Vorfeld aussortiert werden.

Kann man bei intersect eine Logic hinzufügen, bitte für y1 und y2 den Wertebereich -40°C bis +50° betrachten?

temperatur_meppen.txt
 Beschreibung:

Download
 Dateiname:  temperatur_meppen.txt
 Dateigröße:  1.73 MB
 Heruntergeladen:  345 mal
temperatur_ofteringen.txt
 Beschreibung:

Download
 Dateiname:  temperatur_ofteringen.txt
 Dateigröße:  4.57 MB
 Heruntergeladen:  361 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
butschi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2015, 14:31     Titel:
  Antworten mit Zitat      
habs gelößt:

hab den Befehl hinzugefügt und seitdem ist Ruhe:

Code:

daten_ws1(find(daten_ws1(:,2)==-999),:)=[];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 05.05.2015, 17:10     Titel:
  Antworten mit Zitat      
das geht auch ohne das find.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
butschi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2015, 12:55     Titel:
  Antworten mit Zitat      
Hi,

hab ein weiteres Problem: Wie ließt man die Datei strahlung.txt ein, siehe Anhang.

Diese ist etwas anders aufgebaut als die Temperatur.txt.

Das besondere liegt am Datum, da dort mit einem Doppelpunkt gearbeitet wird.

z.B.:


Stations_ID; Mess_Datum; ...
4466;1980010100:24; ...

Wieviele "%f" soll ich schreiben? Also wie wird der Doppelpunkt bearbeitet. Die Zahlenwerte nach dem Doppelpunkt benötige ich nicht (obiges Beispiel 24).


Anbei mein nicht funktionierender Code:


[code]
% Globalstrahlung

fileID = fopen('Daten\strahlung.txt','r');
formatSpec = '%f%f%f%f%f%f%f%s%[^\n\r]';
dataArray = textscan(fileID, formatSpec,'Delimiter', ';', 'HeaderLines', 1);
[data_zeit, data_strahlung] = dataArray{[2,6]};
data_datum = datenum(num2str(data_zeit),'yyyymmddHH');
strahlung = [data_datum data_strahlung];
strahlung(find(strahlung(:,2)==-999),:)=[];
[/code]

vielen dank im Vorraus

strahlung.txt
 Beschreibung:

Download
 Dateiname:  strahlung.txt
 Dateigröße:  25.34 MB
 Heruntergeladen:  677 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
butschi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2015, 13:21     Titel:
  Antworten mit Zitat      
habs:

[code]

% Globalstrahlung

fileID = fopen('Daten\strahlung.txt','r');
formatSpec = '%f%f:%f%f%f%f%f%f%f%f:%f%s%[^\n\r]';
dataArray = textscan(fileID, formatSpec,'Delimiter', ';', 'HeaderLines', 1);
[data_zeit, data_strahlung] = dataArray{[2,8]};
data_datum = datenum(num2str(data_zeit),'yyyymmddHH');
strahlung = [data_datum data_strahlung];
strahlung(find(strahlung(:,2)==-999),:)=[];

[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.