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 richtig einlesen und erkennen

 

Annagoesmatlab
Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 04.11.12
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.04.2017, 10:13     Titel: Datum richtig einlesen und erkennen
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem bei dem Einlesen meiner Daten aus einer .CSV Datei:

Die Datei besteht aus einer Tabelle mit 5 Spalten, die bis auf die Spalte mit dem time stamp richtig erkannt wird. Nur in der Spalte mit dem Datum kommt die Meldung "NaT".
Der time stamp unterliegt keinem Algorithmus, sprich Matlab muss genau das zugehörige Datum erkennen.

Mein bisheriger Code:
Code:
formatSpec = '%{yyyy-mm-dd HH:MM:SS.FFF}D%f%f%f%f';
T = readtable('vehicle_data_report.csv','Delimiter',';', ...
    'Format',formatSpec);


Der time stamp liegt genau in dem Format yyyy-mm-dd HH:MM:SS.FFF vor. Wie bekomme ich also Matlab jetzt dazu die time stamp Spalte auch als Datum mit Uhrzeit zu erkennen?

Vielen Dank im Voraus.
Grüße,
Anna
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.447
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.04.2017, 10:24     Titel:
  Antworten mit Zitat      
Hallo,

wenn du die Datei bzw. einen Ausschnitt davon, mit dem das Problem auftritt, anhängst, wäre das sehr hilfreich.

Ein Problem könnte sein, dass du Minuten und Monate vertauscht hast. Richtig dürfte sein: {yyyy-MM-dd HH:mm:SS.FFF}
https://www.mathworks.com/help/matl.....operties.html#prop_Format

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 04.11.12
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.04.2017, 11:19     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für den konstruktiven Hinweis. Anbei habe ich jetzt einen Auschnitt meiner Tabelle. Dabei ist mir aufgefallen, dass es anscheinend Fehler bei der Zeit/Datenerfassung gibt, so dass zwischen den eigentlich fortlaufenden Daten auf einemal der 2.12.16(falsches Datum davor und danach 15.11.16) kurzzeitig auftaucht. Ist es daher für Matlab vielleicht ein Problem, wenn keine erkennbare Reihenfolge der time stamp Daten vorliegt?

Grüße,
Anna

p.s.: Ich habe die Datei in eine .XLS Datei umgewandelt, da ich .CSV nicht hochladen konnte.

Beispiel Forum.xls
 Beschreibung:

Download
 Dateiname:  Beispiel Forum.xls
 Dateigröße:  125 KB
 Heruntergeladen:  425 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

was passiert denn, wenn du es mit dem angepassten Datumsformat versuchst?

.csv-Dateien kannst du gezippt anhängen.
Die unsortierten Datumsangaben in der ersten Spalte sollten kein Problem sein.

Wenn ich die Excel-Datei öffne, hat die erste Spalte ein anderes Format als von dir angegeben. Außerdem würde ich eher die letzte Spalte als Problem sehen, da ich dort mittendrin Datumsangaben sehe.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 04.11.12
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.04.2017, 13:57     Titel:
  Antworten mit Zitat      
Hallo Harald,

bei der schnellen Datenübertragung der .CSV Datei in Excel treten diese Fehler in Form eines Datums anstatt einer Zahl in der letzten Spalte auf. Daher will ich eigentlich am liebsten auch Excel komplett außen vor lassen.
Daher habe ich jetzt einfach noch mal die .CSV Datei gezippt anghängt.

Vielen Dank im Voraus.
Anna

vehicle_data_report.zip
 Beschreibung:

Download
 Dateiname:  vehicle_data_report.zip
 Dateigröße:  3.36 MB
 Heruntergeladen:  414 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

zwei Probleme: die Datumsangaben sind in " ", und manchmal fehlen die Tausendstel komplett.

So kann man sich zumindest behelfen:
Code:
formatSpec = '%s%f%f%f%f';
T = readtable('vehicle_data_report.csv','Delimiter',';', ...
    'Format',formatSpec);
T.time_stamp = strrep(T.time_stamp, '"', '');
T.time_stamp2 = datetime(T.time_stamp, 'InputFormat', 'yyyy-MM-dd HH:mm:ss.SSS');
failed = isnat(T.time_stamp2);
T.time_stamp2(failed) = datetime(T.time_stamp(failed), 'InputFormat', 'yyyy-MM-dd HH:mm:ss');


Bzgl. eines besseren Umgangs mit den fehlenden Tausendsteln könntest du auch mal den Technischen Support von MathWorks kontaktieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 04.11.12
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 26.04.2017, 09:17     Titel:
  Antworten mit Zitat      
Vielen Dank Harald!

Das hätte ich alleine echt nicht geschafft. Die Millisekunde sind mir eigentlich egal. So genau muss ich nicht auswerten.

Hast du auch eine Idee, wie ich jetzt die erfassten Daten Pro Datum (Tag) mitteln kann? So dass sich meine Messdaten um ein Vielfaches kürzen.
Das ganze soll dann in einer neuen Matrix stehen, so dass ich damit einen besseren Überblick über den groben Verlauf bekomme.

Grüße,
Anna
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich hätte sogar min. zwei Ideen. Da ist allerdings die Frage, welches Release du verwendest. Das bitte gerne auch ins Profil eintragen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 04.11.12
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 26.04.2017, 09:52     Titel:
  Antworten mit Zitat      
Guten Morgen,

Ich habe die R2015b Version zu meiner Verfügung.

Grüße,
Anna
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.447
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.04.2017, 10:18     Titel:
  Antworten mit Zitat      
Hallo,

Code:
formatSpec = '%s%f%f%f%f';
T = readtable('vehicle_data_report.csv','Delimiter',';', ...
    'Format',formatSpec);
time_stamp = strrep(T.time_stamp, '"', '');
T.time_stamp = datetime(time_stamp, 'InputFormat', 'yyyy-MM-dd HH:mm:ss.SSS');
failed = isnat(T.time_stamp);
T.time_stamp(failed) = datetime(time_stamp(failed), 'InputFormat', 'yyyy-MM-dd HH:mm:ss');

%% Per day
T.time_stamp = dateshift(T.time_stamp, 'start', 'day');
[gp, id] = findgroups(T.time_stamp);
fun = @(x) splitapply(@mean, x, gp);
T2 = varfun(fun, T, 'InputVariables', @isnumeric);
T2.time_stamp = id;
T2 = T2(:, [end, 1:end-1]);
T2.Properties.VariableNames = T.Properties.VariableNames;


Mit timetables (ab R2016b) ginge es einfacher...

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 04.11.12
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 26.04.2017, 10:49     Titel:
  Antworten mit Zitat      
Super vielen Dank!

Nur noch eine Frage Embarassed : Wie kann ich denn den Zeitvector plotten?
Denn
Code:
figure(1)
plot(T2.time_stamp,T2.power_consumption)
datetick('x',0,'keepticks')


funktioniert nicht.

Tut mir leid, wenn es nun doch so viele Fragen waren, aber mit einem Datum habe ich davor in Matlab noch nie arbeiten müssen.

Grüße,
Anna
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.447
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.04.2017, 11:25     Titel:
  Antworten mit Zitat      
Hallo,

der erste Eintrag in T2 scheinen ungültige Datumsstempel zu sein. Diese kannst du weglassen, und dann direkt plotten.
Code:
T2(1,:) = [];
plot(T2.time_stamp,T2.power_consumption)


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 04.11.12
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 26.04.2017, 11:40     Titel:
  Antworten mit Zitat      
Vielen Dank, du hast mir wirklich sehr weiter geholfen.

Grüße,
Anna
Private Nachricht senden Benutzer-Profile anzeigen
 
Annagoesmatlab
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 04.11.12
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 03.08.2017, 10:52     Titel:
  Antworten mit Zitat      
Hallo,

die Daten werden ja per Tag zusammengefasst, nur brauche ich sie nun aber leider doch in Viertelstundenwerten. Hat jemand eine Idee, wie ich die bestehende Auswertung...
Code:
%% Per day
T.time_stamp = dateshift(T.time_stamp, 'start', 'day');
[gp, id] = findgroups(T.time_stamp);
fun = @(x) splitapply(@mean, x, gp);
T2 = varfun(fun, T, 'InputVariables', @isnumeric);
T2.time_stamp = id;
T2 = T2(:, [end, 1:end-1]);
T2.Properties.VariableNames = T.Properties.VariableNames;

...ändern kann, damit ich anstatt tageweiser Zusammenfassung auf Viertelstundenwerte komme?

Vielen Dank im Voraus.

Liebe Grüße,
Anna
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

versuch mal die erste Zeile von deinem Code abzuändern in:
Code:
T.time_stamp.Minute = floor(T.time_stamp.Minute /15)*15;

Damit sollte HH:MM:SS abgebildet werden auf
HH:00:SS, falls 0 <= MM < 15
HH:15:SS, falls 15 <= MM < 30
HH:30:SS, falls 30 <= MM < 45
HH:45:SS, falls 45 <= MM < 60

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

Gehe zu Seite 1, 2  Weiter

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.