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

Frage bzgl. Datum (suchen nach fehlerhaften Daten mit Datum)

 

datumistdoof
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 12.01.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2017, 14:25     Titel: Frage bzgl. Datum (suchen nach fehlerhaften Daten mit Datum)
  Antworten mit Zitat      
Hallo an alle!
Ich habe folgendes Problem und ich habe dazu im Internet nichts gefunden. Ich hoffe ihr könnt mir vielleicht dabei helfen.

Folgendes Problem:
Ich habe eine Tabelle mit Messdaten und möchte diese Daten auf Vollständigkeit überprüfen. Es ist bekannt, dass die Messdaten alle 10 Minuten gelogget werden mit Datum und Uhrzeit (Siehe Beispieldatei).
Ich möchte nun in Matlab einfach nur abfragen, ob "Messwert 2-Messwert 1= 10 Minuten" ist, denn wenn dies nicht der Fall ist, dann weiß ich ein Messwert fehlt.

Ich habe ein bisschen rumprobiert und verstehe die ganze Materie mit dem Datum nicht.

Hier mal ein Codebeispiel und die Frage dazu:

Code:

%Prüfen der Messdaten mit Ausgabe der fehlenden Werte in eine .txt bzw .csv
%Datei mit folgenden Eigenschaften:

%1. Zeile: Spaltenbeschriftung
%2. Zeile: Datum;Zeit;Wert

clear all;

%Name der zu überprüfendenen Datei
Name = 'test0.txt';

%Definition der Formate
Zeitstring ='dd.mm.yyyy,HH:MM';

%Öffnen des Textes
fid=fopen(Name,'r');
data=textscan(fid,'%s %s %s','Headerlines',1,'delimiter',';');
fclose(fid);

%Definition der Arrays
Datum=data{1,1};
Uhrzeit=data{1,2};
Wert=data{1,3};


%Zusammenfügen von Datum und Zeit in Array zeit

Zeit=[strcat(Datum,',',Uhrzeit)];


%Umwandeln der Zeit in einen String

zeit_temp={length(Datum);1};

for l=1:length(Datum)
    zeit_temp{l,1}=datenum(Zeit{l,1},Zeitstring);
end

clear l;

zeit_temp1={length(Datum);1};

for l=1:length(Datum)
    zeit_temp1{l,1}=datestr(zeit_temp{1,1}+(0.00694444496184587*l));
end

clear l;

for l=2:length(Datum)
    zeit_temp2{l,1}= zeit_temp{(l),1}-zeit_temp{l-1,1};
end
 


Am Anfang lese ich alles ein, füge das Datum und die Zeit zu einer Spalte zusammen und wandel mir die Zeit mit datestr um. Soweit so gut.
Wenn ich nun aber die Differenz aus den jeweils benachbarten Werten (zeit_temp2) bilde, dann verstehe ich nicht, warum die Differenz zwischen dem 01.01.2013 23:50 und dem 04.01.2013 00:00 (Zeile 144 und 145) genauso groß ist, wie ein Differenz zwischen dem 01.01.2013 00:00 und 01.01.2013 00:10.

Des Weitern würde ich auch gerne mit einer "if-Abfrage" arbeiten.
Code:

abstand=zeit_temp{2,1}-zeit_temp{1,1};
if zeit_temp{i+1,1}-zeit_temp{i,1} == abstand
    ....usw.
 


Allerdings ist hier das Problem das meine Abfrage in 99% der Fälle 0 und nicht 1 ausgibt, da anscheinend die Zeit nie genau 10 Minuten ist, sondern in der Regel immer etwas weniger. (Könnte ich mit "<= abstand" umgehen, aber was ist wenn die Messwerte zum Beispiel aus irgendwelchen Gründen einen Abstand von nur 3 Minuten haben, dann wäre es falsch, aber die Abfrage würde trotzdem eine 1 anstatt einer 0 zurückgeben)


Und zu guter Letzt noch eine Frage. Wenn mir zum Beispiel Messwerte fehlen, dann will ich dies in einer .txt dokumentieren. Dafür muss ich dem letzten bekannten Zeitpunkt immer wieder 10 Minuten addieren bis ich wieder Daten "habe". Das habe ich temp_1 ausprobiert, aber meine 10 Minuten entsprechen in dem Beispiel der Zahl 0.00694444496184587. Anders habe ich es nicht hinbekommen, da mir Matlab sonst immer zu ungenaue Werte liefert (z.B. 01.01.2013 10:00:12). Er addiert also entweder zu viel oder zu wenig, aber nie genau 10 Minuten.

Vielen Dank schon mal fürs durchlesen und entschuldigung, falls es etwas undurchsichtig sein sollt. Bei Unklarheiten einfach fragen.

test0.txt
 Beschreibung:

Download
 Dateiname:  test0.txt
 Dateigröße:  3.03 KB
 Heruntergeladen:  270 mal


Zuletzt bearbeitet von datumistdoof am 12.01.2017, 15:01, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2017, 14:30     Titel:
  Antworten mit Zitat      
Hallo,

für die Arbeit mit Datumsangaben würde ich datetime empfehlen. Damit sollten sich solche Probleme relativ leicht lösen lassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
datumistdoof
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 12.01.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2017, 15:01     Titel:
  Antworten mit Zitat      
DANKE!

Jetzt bekomme ich in meiner zeit_temp2 exakt einen Wert raus, der 10 Minuten entspricht! Und bei dem Sprung mit den Tagen bekomme ich als Lücke 48:10:00!!!!!!

Ich hab bis jetzt immer mit datenum gearbeitet, aber auf die Idee, dass es noch mehr geben könnte bin ich natürlich nicht gekommen....

Tausend Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2017, 15:09     Titel:
  Antworten mit Zitat      
Hallo,

gibt es ja auch noch nicht soooo lange. Seit R2014b, um genau zu sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
datumistdoof
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 12.01.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2017, 19:13     Titel:
  Antworten mit Zitat      
So ich hab dann doch noch mal eine Frage.

Ich habe meinen Code nun fertig und er funktioniert auch (meiner Meinung nach wunderbar).
Allerdings macht Matlab irgendwie etwas komisch.

Code:

%Prüfen der Messdaten mit Ausgabe der fehlenden Werte in eine .txt bzw .csv
%Datei mit folgenden Eigenschaften:

%1. Zeile: Spaltenbeschriftung
%2. Zeile: Datum;Zeit;Wert

clear all;

%Name der zu überprüfendenen Datei
%Name = uigetfile('*.txt');
Name = 2014.txt'

%Name der .txt, in der die Fehltage abgespeichert werden
Fehltage = 'Fehltage_test_mpi.txt';

%Definition der Formate
Zeitstring ='dd.MM.yyyy,HH:mm';

%Öffnen des Textes
fid=fopen(Name,'r');
data=textscan(fid,'%s %s %s','Headerlines',1,'delimiter',';');
fclose(fid);

%Definition der Arrays
Datum=data{1,1};
Uhrzeit=data{1,2};
Werte=data{1,3};

%Umwandeln von Werte von String in Double

werte_temp=zeros(length(Werte),1);
werte_temp=str2double(Werte);


%Zusammenfügen von Datum und Zeit in Array zeit

Zeit=[strcat(Datum,',',Uhrzeit)];


%Umwandeln der Zeit in einen String

zeit_temp={length(Datum);1};

%Umwandeln der Zeit in ein für Mtalb verarbeitbares Material
for l=1:length(Datum)
    zeit_temp{l,1}=datetime(Zeit{l,1},'InputFormat',Zeitstring);
end

Abstand=zeit_temp{2,1}-zeit_temp{1,1};
Startzeit=zeit_temp{1,1};
fid_1 = fopen(Fehltage,'a');


%zeitlicher Abstand von jedem Wert (Nur zu Überprüfung)
for l=2:length(Datum)
    zeit_temp2{l,1}= zeit_temp{(l),1}-zeit_temp{l-1,1};
end

%Eigentliche Überprüfung und speichern der fehlenden bzw. NaN-Werte.
for i=2:length(Datum)

    %Prüfen,ob delta T = 10 min
    if zeit_temp{i,1}-Startzeit == Abstand
       Startzeit = Startzeit+Abstand;  
       
        %Überprüfen, ob gefundener Wert = NaN
        if isnan(werte_temp(i,1))
            fprintf(fid_1,'%s;%f\n', Startzeit,werte_temp(i,1));
        else
        end
     
       
    else
       %Speichern der fehlenden Werte, bis wieder Wert vorhanden
       Startzeit = Startzeit+Abstand;
       luecke=((zeit_temp{i,1}-Startzeit)/Abstand);
       u=0;
       
       while u<luecke
     
        Startzeit = Startzeit+Abstand;
        txttime=Startzeit-Abstand;
        fprintf(fid_1,'%s\n', txttime);
        u=u+1;
       
       end
    end
end

fclose(fid_1);
 


Ich habe jetzt mal rumprobiert und bei kleinen zeitlichen Abschnitten funktioniert es. (2014_teil.txt).
Wenn ich nun aber nicht den Auschnitt betrachte, sondern das ganze Jahr (2014.txt), dann zeigt er mir mit dem gleichen Code in der Ausgabedatei am Ende die fehlenden Daten nicht mehr an, die er mir bei der kleinen Datei noch angezeigt hat. (In beiden sind die gleiche fehlenden Tage enthalten 24.09.2014 18:00 bis 25.09.2014)
Es liegt übrigens nicht an dem Beispiel. Matlab reagiert immer so, wenn die Datenmenge zu groß wird, dass er Fehlwerte nicht mehr ausgibt)

Vielen Dank schon mal fürs Durchlesen und ich hoffe jemand weiß weiter, weil ich habe echt schon alles versucht...

Edit: Was mit gerade auffällt ist, dass meine Variable "luecke" bei der großen Datei -87 ist und bei der kleinen 95...???? Ich verstehe es wirklich nicht.

2014_teil.txt
 Beschreibung:

Download
 Dateiname:  2014_teil.txt
 Dateigröße:  66.73 KB
 Heruntergeladen:  324 mal
2014.txt
 Beschreibung:

Download
 Dateiname:  2014.txt
 Dateigröße:  1.22 MB
 Heruntergeladen:  287 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.01.2017, 00:14     Titel:
  Antworten mit Zitat      
Hallo,

der Code ist recht länglich und schwer zu überblicken. Einiges könnte sicher vereinfacht werden, z.B. kann man Datumsangaben direkt als solche einlesen (%D) und die letzte for-Schleife dürfte sich über logische Indizierung abbilden lassen.

Ansonsten kann ich nur Debugging empfehlen, um das Problem einzugrenzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2024 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.