Verfasst am: 02.11.2012, 12:30
Titel: Datum mit einander vergleichen
Hallo,
ich weiß, dass es dieses Thema schon einmal gab, aber leider hilft mir das bei meinem Problem nicht weiter.
Ich habe eine Zeitreihe und möchte nach Einträgen suchen. Der Datumsvektor sieht wie folgt aus:
vector =
01.01.2012 00:09:50
01.01.2012 00:19:50
01.01.2012 00:29:50
01.01.2012 00:39:50 ...
Suche ich nun mit
find(datenum(vector,'dd.mm.yyyy HH:MM:SS') == datenum(01.01.2012 00:09:50,'dd.mm.yyyy HH:MM:SS'))
so wird der Wert nicht gefunden. --> 'Empty matrix: 0-by-1'
Gebe ich jedoch vector(1) ein, kommt das richtige Ergebnis.
Kann es sein, dass beim Vergleich der beiden 'datenum' auf Millisekunden genau verglichen wird und wenn das nicht der Fall ist werden sie als ungleich behandelt?
Wie kann ich nun den Vergleich nur bis zu Sekunden genau durchführen?
Oder hat jemand eine Idee, wie ich es noch besser machen könnte?
Hallo Harald,
danke für deine schnelle Antwort. Ich hab den Wald vor lauter Bäumen nicht gesehen. Dein Code funktioniert bei mir auch.
Ich mache den Vector selbst, wie folgt:
Code:
anfang = datevec(datenum('01.01.201200:09:50','dd.mm.yyyy HH:MM:SS'));
t1 = round(datenum(anfang) * 86400);
ende = datevec(datenum('31.01.201200:09:50','dd.mm.yyyy HH:MM:SS'));
t2 = round(datenum(ende) * 86400);
t = round((t1:600:t2) / 86400);
date_complete = t';
Jedoch weiß ich nicht woher dieser kommt. Wahrscheinlich durch die Produktion des Datum-Vektors, ich weiß aber nicht wie ich diesen auf Sekunden genau und Millisekunden auf 0 "runden" kann.
Das Runden auf ganze Sekunden geht am einfachsten im DATEVEC Format, bei dem Jahr, Monat, Tag, Stunde, Minute und Sekunde in verschiedene Spalten stehen. Ein einfaches ROUND rundet dann die Sekunden - die anderen Werte sind bereits Integers.
Wahrscheinlich ist CEIL besser, ansonsten wird 59.512 Sekunden nicht sinnvoll gerundet. Nach der Umrechnung per DATENUM macht das allerdings nichts aus, da dies die 60 Sekunden automatisch in Minuten überlaufen lässt.
Hallo Jan.
danke für deinen Hinweis. Wenn ich im Datumsvektor runde und das Ergebnis danach in datenum umwandle, bekomme ich schöne glatte Zahlen, jedoch nicht in dem Abstand wie ich es brauche
Das heißt nicht so:
vector = {'01.01.2012 00:09:50'
'01.01.2012 00:19:50'
'01.01.2012 00:29:50'
'01.01.2012 00:39:50'}
Jedoch dauert diese Suche sehr lange (ca. 40min.! für eine 90000x13 Matrix).
Jetzt fällt mir einfach keine geschicktere Lösung ein, für die Suche und Zuordnung.
Habt ihr noch eine Idee?
Um mein Problem nochmal in Gänze darzustellen hier die Erklärung:
Es geht um folgendes. Ich habe unterschiedliche Messwerte, mit verschiedenen Zeitintervallen. Diese möchte ich, um sie besser vergleichen und geordnet abspeichern zu können in eine einheitliche Matrix bringen.
So habe ich mir zunächst einen Vektor mit den Zeiten und Daten erstellt, an den nun die Werte ergänzt werden sollen.
Die unterschielichen Messergebnisse habe ich schon auf die Plausibilität geprüft und Fehler bzw. Lücken durch NaN ersetz.
Nun kommt der Teil bei dem ich keine gute Idee habe. Ich muss diese Messergebnisse zu meinem neuen/geordneten Datumsvektor ergänzen.
Dies mache ich momentan mit einer for-Schleife, was ewig dauert (ca. 40min.! für eine 90000x13 Matrix), da ich Zeile für Zeile durchlaufe...
ist jetzt etwas schwierig nachzuvollziehen. Ich würde aber vermuten, dass unter der Voraussetzung, dass beide Zeitvektoren sortiert sind und alle Zeilen von time_num_vec genau einmal in t vorkommen, etwas folgender Art gehen sollte:
Falls dies nicht funktioniert, bitte ein lauffähiges Beispiel (insbesondere fehlt mir time_num; ein weiterer Vektor wie WS_norm wäre hilfreich) zur Verfügung stellen.
denn "ismember" liefert einen Vektoren mit 0 oder 1 zurück. Wenn ich also daraus die '1' suche habe ich die Zeilenzahl und kann so dieser Zeile einen Wert zuordnen.
solltest du weglassen können ("logische Indizierung").
Grüße,
Harald
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.