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

Datum mit einander vergleichen

 

keypal
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 22.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2012, 12:30     Titel: Datum mit einander vergleichen
  Antworten mit Zitat      
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?

Bin für jeden Ratschlag dankbar,
Lg Keypal
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: 02.11.2012, 12:47     Titel:
  Antworten mit Zitat      
Hallo,

folgender Code
Code:
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'}

find(datenum(vector,'dd.mm.yyyy HH:MM:SS') == datenum('01.01.2012 00:09:50','dd.mm.yyyy HH:MM:SS'))

liefert bei mir 1 zurück.

Probier das bitte mal bei dir.
Wenn das bei dir auch funktioniert ist die Frage: was machst du in deinem "echten" Code anders?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 22.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2012, 13:38     Titel:
  Antworten mit Zitat      
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.2012 00:09:50','dd.mm.yyyy HH:MM:SS'));
t1 = round(datenum(anfang) * 86400);

ende = datevec(datenum('31.01.2012 00:09:50','dd.mm.yyyy HH:MM:SS'));
t2 = round(datenum(ende) * 86400);
t = round((t1:600:t2) / 86400);
date_complete = t';


Suche ich nun den '01.01.2012 00:09:50' ergibt das:

Code:

find(date_complete == datenum('01.01.2012 00:09:50','dd.mm.yyyy HH:MM:SS'))
ans =
   Empty matrix: 0-by-1
 


Da ich weiß, dass es dieses Datum gibt und es das erste im Vektor sein muss gebe ich folgendes ein und bekomme das richtige Ergebnis:
Code:

datestr(date_complete(1),'dd.mm.yyyy HH:MM:SS')

ans =

01.01.2012 00:00:00
 


Also muss es einen Unterschied zwischen den beiden Daten geben...
Code:
date_complete(1) - datenum('01.01.2012 00:09:50','dd.mm.yyyy HH:MM:SS')

ans =

   -0.0068


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.

Fällt dir etwas dazu ein?

Lg, Keypal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.11.2012, 14:40     Titel:
  Antworten mit Zitat      
Hallo keypal,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
keypal
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 22.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2012, 15:08     Titel:
  Antworten mit Zitat      
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'}

Sondern:
vector = {'01.01.2012 00:09:52'
'01.01.2012 00:19:51'
'01.01.2012 00:28:50'
'01.01.2012 00:39:50'}

Ich habe mich also entschieden einfach nach dem Datumsvektor zu suchen, mit ismember auch kein Problem:
Code:

for h = 1:size((time_num),1)
dummy = ismember(t,time_num_vec(h,:),'rows');
dummy = find(dummy == 1);

values(dummy,2) = time_num(h);
end
 


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?

Lg, Keypal
Private Nachricht senden Benutzer-Profile anzeigen
 
keypal
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 22.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2012, 15:09     Titel:
  Antworten mit Zitat      
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.

Code:

% time1 = Startdatum
time1 = datenum(datevec([03 02 2011 00 09 50])) * 86400;

% time2 = Enddatum; values = Ergebnismatrix
time2 = datenum(datevec([29 02 2011 23 59 00])) * 86400;

t = (time1:600:time2) / 86400;
t = ceil(datevec(t));
 


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

Code:

% Messvektor  = time_num
time_num_vec = datevec(time_num);

% Referenzvektor = t
values = datenum(t);
values(:,2:11) = NaN(size(values,1),10);

for h = 1: size((time_num),1)

    dummy = ismember(t,time_num_vec(h,:),'rows');
    dummy = find(dummy == 1);

    values(dummy,2) = time_num(h);
    values(dummy,3) = WS_norm(h);
    values(dummy,4) = PW(h);
    values(dummy,5) = T(h);
    values(dummy,6) = P(h);
    values(dummy,7) = RPM(h);
    values(dummy,8) = TI(h);
    values(dummy,9) = nac_pos(h);
    values(dummy,10) = WD(h);
    values(dummy,11) = pos_rel(h);
end
 


Ich muss das Datum in Vektor-Schreibweise durchsuchen, da sonst Ungenauigkeiten in Milisekundenbereich die Suche verfälschen.
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: 05.11.2012, 19:38     Titel:
  Antworten mit Zitat      
Hallo,

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:

Code:
bedingung = ismember(t, time_num_vec,  'rows')
values(bedingung,2)  = time_num;
values(bedingung,3)  = WS_norm; % usw.


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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 22.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2012, 15:14     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für deine Idee, es funktioniert! Jetzt ist die Routine so schnell, dass ich wirklich damit arbeiten kann.

ich habe die Funktion so zum laufen gebracht:
Code:

bedingung = ismember(t, time_num_vec,  'rows');
bedingung = find(bedingung == 1);

values(bedingung,2)  = time_num;
values(bedingung,3)  = WS_norm;
 


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.

Danke nochmal für die guten Ideen,
Keypal
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: 06.11.2012, 15:32     Titel:
  Antworten mit Zitat      
Hallo,

die Zeile
Code:
bedingung = find(bedingung == 1);

solltest du weglassen können ("logische Indizierung").

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.