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 und Zeit addieren

 

Geranie
Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 03.06.2013, 10:11     Titel: Datum und Zeit addieren
  Antworten mit Zitat      
Hallo zusammen,

sieht vone uch zufällig jemand den Fehler in folgendem Code?

Ich möchte Datum und eben die passende Zeit addieren (ich habe 12 excel-tabellen, die ich einlese, mit viertelstündlichen Daten). Mein Problem tritt im Februar auf, dort habe ich für 29 Tage (und 2784 Datumswerte) plötzlich 2976 Zeitwerte, was zwei Tagen zu viel entspricht. Daher meien Überlegung, ob er die Zeitwerte wieder von Januar entnimmt? Ich sehe bloß irgendwie den Fehler im Code nicht:

Code:
date = datenum(untitled(6:end,1),'dd.mm.yyyy');
   
   timeRaw = regexp(untitled(6:end,2),'-','split');
     
        for iTime = 1:length(timeRaw)
            time(iTime,1) = datenum(timeRaw{iTime,1}{1,1}) - floor(datenum(timeRaw{iTime,1}{1,1}));
        end
     
   moRaw(iRead).time = date + time;


Der Fehler tritt für die letzte Zeile (date + time) auf, wo eben die Matrix Dimension nicht mehr übereinstimmt.
timeRaw enthält (wie gewünscht) 2784 Werte, somit auch iTime, nur time enthält dann plötzlich 2976 Werte.

Noch kurz zum timeRaw. ich splitte die Zeit, weil sie folgendermaßen eingetragen ist: 00:00 - 00:15

Lieben Gruß!
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: 03.06.2013, 14:19     Titel: Re: Datum und Zeit addieren
  Antworten mit Zitat      
Hallo Geranie,

Die Variable "time" existioert wahrscheinlich schon vorher. Du erstellst sie ja nicht neu, sondern schreibst nur werte in die existierende Variable. Siehe:
Code:
for k = 1:5
  value(k) = rand;
end
for k = 1:2
  value(k) = 2.0;
end
disp(value)


Nebenbei ist das iterative Wachstum eines Vectors eine der zeitraubendsten Programmier-Sünden. Besser:
Code:
timeRaw = regexp(untitled(6:end,2),'-','split');
   time = zeros(length(timeRaw), 1);
        for iTime = 1:length(timeRaw)
            time(iTime,1) = rem(datenum(timeRaw{iTime,1}{1,1}), 1);
        end


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 03.06.2013, 18:22     Titel:
  Antworten mit Zitat      
Danke Jan!

Dein Code läuft super, nur habe ich jetzt das Problem, dass ich am Ende nur den Dezember ausgegeben bekomme und nicht, wie gewünscht, alle Monate hintereinander gereiht.
Hierfür nochmal die ganze Schleife und die Ausgabefkt.

Code:
for iRead=1:length(fileNames)
   
   disp(fileNames{iRead})
   
   [~, ~, untitled] = xlsread(fileNames{iRead});
   untitled(cellfun(@(x) ~isempty(x) && isnumeric(x) && isnan(x),untitled)) = {''};
 
   % Get dates
   date = datenum(untitled(6:end,1),'dd.mm.yyyy');
   
    timeRaw = regexp(untitled(6:end,2),'-','split');
    time = zeros(length(timeRaw), 1);
        for iTime = 1:length(timeRaw)
            time(iTime,1) = rem(datenum(timeRaw{iTime,1}{1,1}), 1);  
        end
       
   moRaw(iRead).time = date + time;
    moRaw(iRead).data = cell2mat(untitled(6:end,3));
   
     
end
   
   
   clearvars -except moRaw iRead fileNames
   
    dispatch_RZS.time = moRaw(1).time;
    dispatch_RZS.data = moRaw(1).data;


Liegt das an der inneren for-Schleife, mit der ich die Zeit bereinige?
Für andere excel-tabellen, die allerdings die Zeit direkt am Datum hatten (also, innerhalb einer Spalte, somit konnte ich das direkt mit datenum umwandeln ohne zu addieren o.ä.) hat das eigentlich immer direkt funktioniert, dass Matlab mir die Daten aneinander gereiht ausgegeben hat (also dann insgesamt 35136 Werte bei der Ausgabe).
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: 03.06.2013, 19:10     Titel:
  Antworten mit Zitat      
Hallo Geranie,

Es ist nicht klar, wo was als Dezember ausgegeben wird.
Vielleicht hilft Dir der Debugger: Setze einen Breakpoint in den Code und lasse Matlab Zeile für Zeile abarbeiten. Dann sieht man eher, was genau wo passiert.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 04.06.2013, 09:51     Titel:
  Antworten mit Zitat      
Hallo Jan,

ersteinmal nochmal vielen Dank, dass du mir hilfst.

Ich habe gerade mal versucht, mit dem Debugger herauszufinden wo es hakt, komme aber nicht weiter.

Über die beiden letzten Befehle (dispatch_RZS.time und dispatch_RZS.data) erstellt matlab mir ja die dispatch_RZS.mat-Datei, die dann meine vorher eingelesenen Werte enthält. Leider befinden sich darin jetzt aber nur die Dezember-Werte und nicht, wie gewünscht, aus allen zwölf Monaten (und zwölf Excel-Listen).
Mit dem Debugger sehe ich jetzt nur, dass er innerhalb der Schleife den Januar einliest, weiß aber nicht, warum er, wenn alle zwölf Listen eingelesen sind, dann nur den Dezember über die dispatchFunktion ausgibt.


EDIT:
Es scheint tatsaächlich an der dispatch Funktion zu liegen. Für moRaw(1).time bekomme ich die Januarwerte, für moRaw(iRead).time nur die Dezemberwerte... Für moRaw(Smile.time (was dafür grad mein erster Ansatz war) bekomme ich den Fehler: Illegal right hand side in assignment. Too many elements.

jemand eine Idee, wie ich dort alle Elemente von Januar bis Dezember ausgeben lassen kann?
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: 04.06.2013, 11:35     Titel:
  Antworten mit Zitat      
Hallo Geranie,

Soweit ich sehe, haben wir den Code der "dispatch"-Funktion nicht. Deshalb kann man kaum Verbesserungsvorschläge machen.

Der relevante tile des Orginalcodes und eine vollständige Kopie der fehlermeldung helfen im Allgemeinen weiter als beschreibungen von Teilen derselben.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 04.06.2013, 12:20     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich stehe gerade auf dem Schlauch :/
Den Code der dispatch-Funktion finde ich nicht...ich habe den Befehl aus einem andern, ähnlichen Code übernommen, der mir zur Verfügung gestellt wurde. Für zwei andere Messwerte hat er auch funktioniert wie gewünscht...


Eine fehlermeldung habe ich ja eigentlich nicht, ich sehe halt nur, dass in meiner .mat Datei nicht alle Werte drin sind.

Gibt es einen anderen Weg, die Werte aus den Excel-Listen aneinandergehängt als .mat Datei ausgeben zu lassen? Ich habe Zeitwerte und dazu Messwerte.
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: 04.06.2013, 16:54     Titel:
  Antworten mit Zitat      
Hallo Geranie,

Ich erkläre es nochmal:
Zitat:
Es scheint tatsaächlich an der dispatch Funktion zu liegen. Für moRaw(1).time bekomme ich die Januarwerte, für moRaw(iRead).time nur die Dezemberwerte

Da wir den Inhalt der "dispatch"-Funktion nicht kennen, können wir keine Ahnung haben, was sie macht und wie man das Ergebnis an Deine Bedürfnisse anpassen kann.

Ich habe bisher weder verstanden an welcher Stelle im Code das Problem auftritt, z.B. in welcher Zeile und in welcher Variablen, noch von welcher Art von Datei Du sprichst.
Zitat:
Über die beiden letzten Befehle (dispatch_RZS.time und dispatch_RZS.data) erstellt matlab mir ja die dispatch_RZS.mat-Datei

Die gezeigten Befehle erzeugen gar keine Datei, sondern einen Struct.

Zitat:
... Für moRaw(:).time (was dafür grad mein erster Ansatz war) bekomme ich den Fehler: Illegal right hand side in assignment. Too many elements.

Um hier einen Verbesserungsvorschlag machen zu können, benötigen wir die komplette Zeile.

Bitte versuche also nochmal das Problem genauer zu erklären.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 04.06.2013, 17:29     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für deine Geduld!
Ich glaube, ich verwende hier oft falsche Begriffe um mich auszudrücken, da ich mich nur mit Hilfe eines Freundes in Matlab versucht habe einzuarbeiten.
dispatch ist bspw. gar keine Funktion sondern erzeugt mir eben , wie du sagtest, einen struct.

So, ich füge hier jetzt noch einmal den Code ein und versuche dann nochmal, mein Problem zu erklären:

Code:
for iRead=1:length(fileNames)
   
   disp(fileNames{iRead})
   
   [~, ~, untitled] = xlsread(fileNames{iRead});
   untitled(cellfun(@(x) ~isempty(x) && isnumeric(x) && isnan(x),untitled)) = {''};
 
   % Get dates
   date = datenum(untitled(6:end,1),'dd.mm.yyyy');
   
    timeRaw = regexp(untitled(6:end,2),'-','split');
    time = zeros(length(timeRaw), 1);
        for iTime = 1:length(timeRaw)
            time(iTime,1) = rem(datenum(timeRaw{iTime,1}{1,1}), 1);  
        end
       
   moRaw(iRead).time = date + time;
    moRaw(iRead).data = cell2mat(untitled(6:end,3));
   
     
end
   
   
   clearvars -except moRaw iRead fileNames
   
    dispatch_RZS.time = moRaw(1).time;
    dispatch_RZS.data = moRaw(1).data;
 


Das Einlesen funktioniert wie gewünscht, alle Daten sind da. Mein Problem ist nun nur noch, dass ich in dispatch_RSZ alle Daten hintereinandergeschrieben stehen haben möchte, also vom 1.1.2012 bis zum 31.12.2012 (für die Datums- und die Messwerte).
Ich habe nun in moRaw alle meine Daten, d.h. in moRaw(1,1).time stehen meine Zeitdaten vom 1.1.2012 bis zum 31.1.2012 und in moRaw(1,2) vom 1.2.2012 bis zum 29.2.2012 und so weiter. In moRaw(1,1).data stehen die zugehörigen Messwerte für Januar usw.

Für den obigen Code erhalte ich nun aber nur meine Januarwerte in dispatchRZS. Gebe ich moRaw(2).time und moRaw(2).data ein, eben nur die Februarwerte usw.

Für
Code:
   dispatch_RZS.time = moRaw(:).time;
    dispatch_RZS.data = moRaw(:).data;

bekomme ich folgende Fehlermeldung: Illegal right hand side in assignment. Too many elements.


Ich möchte im Endeffekt die gesamten Messdaten aus 2012 über die Zeit plotten.

Ist das jetzt verständlicher erklärt oder fehlt noch Information?
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: 04.06.2013, 17:41     Titel:
  Antworten mit Zitat      
Hallo Geranie,

Nun wird mir Dein Problem klarer. Und Geduld macht mir immer Freude, wenn sie mir erlaubt ein Problem besser zu verstehen.

Wie wäre es damit:
Code:
dispatch_RZS.time = cat(1, moRaw.time);
dispatch_RZS.data = cat(1, moRaw.data);

Eventuell sieht es weniger verwirrend aus, wenn man explizit ausdrückt, dass "moRaw" ein Array ist:
Code:
dispatch_RZS.time = cat(1, moRaw(:).time);

Das Ergebnis ist aber das gleiche.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 44
Anmeldedatum: 27.05.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 04.06.2013, 17:49     Titel:
  Antworten mit Zitat      
Jan, du bist der Wahnsinn!
Ich danke dir, ganz genau so wollte ich das haben.

Wirklich vielen, vielen Dank! So schnell und einfach kann es gehen, wenn man ordentlich erklärt, da werd ich mich mehr bemühen nächstes Mal Smile
Danke!
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: 04.06.2013, 17:57     Titel:
  Antworten mit Zitat      
Hallo Geranie,

Es freut mich, dass es Dir hilft und dass auch du genug Geduld hattest, um die Rückfragen zu beantworten.

Viele Grüße, 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.