Verfasst am: 21.04.2012, 18:10
Titel: hh:mm:ss.xxx in sekunden umrechnen und auf x-Achse darstelle
Hallo,
mein Matlabrepertoire ist leider noch klein, jetzt stehe ich vor folgender Aufgabe:
ich habe einen Labview-Datenschrieb mit einer Zeit im Format:
hh:mm:ss.xxx
ich würde diese Werte gerne auch mit den Millisekunden plotten (sonst gibt es pro Sekunde mehrere Einträge auf einem x-Punkt), bisher gelingt es mir nur mit einem übernommenen Programm hh:mm:ss in Sekunden umzurechnen. Mit Millisekunden würde auch helfen einfach einen Bezugswert abzuziehen um eine aussagekräftige Differenz zu bekommen.
kann mir da jemand weiterhelfen?
Außerdem muss dann die Zeit im Format: hh:mm:ss auf die X-Achse??!!
Verfasst am: 21.04.2012, 22:52
Titel: Re: hh:mm:ss.xxx in sekunden umrechnen und auf x-Achse darst
Hallo kathy,
Zitat:
ich habe einen Labview-Datenschrieb mit einer Zeit im Format:
hh:mm:ss.xxx
Was bedeutet dies genau? Kannst Du diese "Werte" bereits aus dem File einlesen? Hast Du sie also als Cell String? Oder die einzelnen "hh", "mm", "ss", "xxx" bereits als Double-Vektoren?
Ein Lösungsvorschlag ist viel einfacher, wenn Du den vorhandenen Input exakt beschreibst.
also das Datenformat sieht in der Datei wie folgt aus:
z.B. 12:23:41.765
bisher lade ich die Datei mit einem Code aus einem Forum ein, den ich nicht bis ins Detail verstehe, der aber funktioniert. Dieser trennt Strings von Zahlen und liest oben genannte Zeitdatei als String ein. Mit datenum lässt sich der Zeitstring Verarbeiten, das sieht im Plot auch gut aus (Danke Harald), ich weiß nur nicht was mit den Ziffern nach dem . passiert. Wenn ich Differenzen zwischen zwei Werten bilde kommen sehr kleine Werte raus, da die Serielle Zeit aber irgendwann im Jahre 0000 anfängt?! habe ich keine Ahnung diese zu verwerten.
Um dieses Fehlerquelle zu umgehen würde ich gerne jeweils die Zahl 12 einlesen *3600 multiplizieren, die zahl 23 einlesen mit 60 multiplizieren, die Zahl 41 einlesen dazu addieren und dann die Nachkommastelle addieren. Ich hab nur keine Ahnung wie.
Dann würde ich nur bei 0 Uhr loslaufen und die Differenzen in millisekunden wären einfach darstellbar.
Ich hänge mal einen Datensatz an.
Ausserdem poste ich hier mal den Code den ich zum einlesen benutze, der enthält auch eine Möglichkeit zur Umwandlung in Sekunden, allerdings ohne Bruchteile von Sekunden und ich verstehe diesen Abschnitt nicht. Zu viele ineinander geschachtelte Funktionen. Vielleicht könnt ihr mir helfen diesen zu verstehen und umzuschreiben:
Code:
function TXTassign(filename,cols,forceStringCols,enableTimeConversion)
%TXTASSIGN Spaltenweise Zuweisung von Datensätzen aus Tab-getrennten Tabellen
% TXTASSIGN(filename, cols, forceStringCols) % filename = Dateiname % cols = Anzahl der Spalten % forceStringCols = Spaltennummern mit erzwungener Formatierung als String % enableTimeConversion = Zeitangabenumwandlung ein, falls ungleich 0
%Wert auf Eignung als Zahl testen, bei Erfolg: gesamte Spalte umwandeln
if(size(regexpi(strValues(col,:),'[^\+\-\.0123456789ed ]')) == [00]) & ~any(forceStringCols==col) for row=1:size(cellStrValues,1)/cols,
a(row) = str2double(strValues(col+(row-1)*cols,:));
end;
assignin('base', char(deblank(varNames(col))), a);
%Umwandlung von Zeitangaben der Form hh:mm:ss in Sekunden ???was passiert hier genau? wie greift man hier auf die einzelnen Zahlen zwischen die : zu in der for schleife? was bedeutet was?
elseif(size(regexpi(strValues(col,:),'\d{2}:\d{2}:\d{2}.\d{3}')) ~= [00]) & enableTimeConversion & ~any(forceStringCols==col) for row=1:size(cellStrValues,1)/cols,
c(row) = eval(strcat('((',strrep(strValues(col+(row-1)*cols,:),':',')*60+')));
end;
assignin('base', char(deblank(varNames(col))), c);
else %falls erster Wert keine Zahl und keine Zeitangabe
for row=1:size(cellStrValues,1)/cols,
b(row,:) = strValues(col+(row-1)*cols,:);
end;
assignin('base', char(deblank(varNames(col))), b);
Vielleicht geht das mit dem Einlesen auch einfacher? Hauptsache die Zeitanteile kleiner 1 Sekunde werden korrekt berücksichtigt und lassen sich als Uhrzeit darstellen!
@ Jan: hilft das so? Wie kann ich die Zeit als double Vektoren einlesen?
@ Harald: wie kann ich bei datetick die Anzahl der Ticks beeinflussen? ich kriegs leider nicht richtig hin
Vielen Dank für die Hilfe!
Gruß,
Kathy
Datensatz.txt
Beschreibung:
ein typischer Datensatz extrahiert aus einem größeren Datensatz in Excel, das Datum (Spalte 1) ist hier unwichtig
Solchen Code würde ich nicht mal mit der Beißzange anfassen. Zunächst REGEXP vom feinsten, dann EVAL und nun noch per ASSIGNIN in den BAse-Workspace schummeln?! Das ist nicht ernsthaft debugbar, oder?
Ein Beispiel für eine banale Umwandlung des Datums:
Code:
Str = '19.10.201110:24:08.828';
Num = sscanf(a, '%d.%d.%d %d:%d:%f');
D = datenummx(Num([3,2,1,4,5,6]));
Damit hast Du eine deutlich schneller Umwandlung als mit DATENUM, aber immerhin das gleiche Ergebnis. Die Genauigkeit reicht vollkommen aus.
Bei der Darstellung mit DATETICK sind die Microsekunden jedoch wahrscheinlich überflüssig. Wenn man hinreichend genau Daten im Microsekunden-Bereich hat, wird sich die Jahreszahl während des Plots nicht ändern, oder? Vielleicht gibt es deshalb eine bessere Darstellung für Dein Problem.
Gruß, Jan
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.