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

hh:mm:ss.xxx in sekunden umrechnen und auf x-Achse darstelle

 

kathy
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2012, 18:10     Titel: hh:mm:ss.xxx in sekunden umrechnen und auf x-Achse darstelle
  Antworten mit Zitat      
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??!!

Freue mich über jede Hilfe!

Gruß

Kathy
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.04.2012, 19:38     Titel:
  Antworten mit Zitat      
Hallo,

wenn t dein Zeitvektor und y deine Daten sind:

Code:


Grüße,
Harald
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: 21.04.2012, 22:52     Titel: Re: hh:mm:ss.xxx in sekunden umrechnen und auf x-Achse darst
  Antworten mit Zitat      
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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2012, 12:26     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Rückmeldung.

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
   
   %die Variablennamen
    varNames = textread(filename,'%s',cols,'delimiter','\t');
   
   
    %Ersetzung von "Sonderzeichen"
    varNames = strrep(varNames,'/','_');
    varNames = strrep(varNames,'(','_');
    varNames = strrep(varNames,')','_')
    varNames = strrep(varNames,'-','_')
   
    %die "nackten" Werte im cell-array
    cellStrValues = textread(filename,'%s',-1,'headerlines',1,'delimiter','\b\t');
   
    %alle Kommas durch Punkt ersetzen
    strValues = char(strrep(cellStrValues,',','.'));
   
   
   
   
    for col=1:cols
   
        %Wert auf Eignung als Zahl testen, bei Erfolg: gesamte Spalte umwandeln
        if (size(regexpi(strValues(col,:),'[^\+\-\.0123456789ed ]')) == [0 0]) & ~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}')) ~= [0 0]) & 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);
           
        end;
       
    end;
 


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

Download
 Dateiname:  Datensatz.txt
 Dateigröße:  56.07 KB
 Heruntergeladen:  689 mal


Zuletzt bearbeitet von kathy am 22.04.2012, 12:34, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
kathy
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 21.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2012, 12:31     Titel:
  Antworten mit Zitat      
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.04.2012, 16:03     Titel:
  Antworten mit Zitat      
Hallo,

ich verstehe nicht genau, warum du dir das antun willst.

Die Genauigkeit von double beträgt rund 10^(-15). Die von dir benötigte Genauigkeit beträgt
Code:
1/735000/24/3600/1000

Double ist also auch bei Zählung ab Jahr 0 genauer als du benötigst.

Wenn du die Zeit nur in Sekunden haben willst, kannst du auch das Referenzdatum
Code:

abziehen und mit 3600*24 multiplizieren.

Grüße,
Harald
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: 23.04.2012, 02:53     Titel:
  Antworten mit Zitat      
Hallo kathy,
Zitat:
Code:

        elseif (size(regexpi(strValues(col,:),'\d{2}:\d{2}:\d{2}.\d{3}')) ~= [0 0]) & 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);
 

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.2011   10: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
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 - 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.