Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Frage zu Tabellen

 

F.red

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2019, 12:16     Titel: Frage zu Tabellen
  Antworten mit Zitat      
Hallo, ich habe mal 2 Fragen zu Tabellen.
Ich habe eine csv, bei nach dem Einlesen mit readtable die Messwerte in der Form '22,45' stehen. (Leider konnte ich die Beispiel.csv nicht hochladen, daher das Bild von der Tablle nach dem Einlesen)
Um das Komma als Dezimaltrennzeichen zu ersetzen, wandle ich die benötigte Spalten in einen String um und ersetzte das Komma durch einen Punkt.

Code:
daten = readtable(dateiname);
daten.Var2=string(daten.Var2);                  
daten. Var2=strrep(daten.Var2, ',','.');


Nur leider kann man mit den Strings so schlecht rechnen. Gibt es eine Möglichkeit die gesamte Spalte einer Tabelle in eine Zahl umzuwandeln?
Ich wäre auch mit einem separaten Spaltenvektor zufrieden. Jedoch kann man str2num nicht auf die gesamte Spalte anwenden, muss man wirklich alle Zeilen per Schleife durchlaufen lassen?

Beste Grüße

Code:
for i=1:length(daten.Var2)
vektor(i)=str2num(daten.Var2(i));
end
 


(Die Fehlervermeidung bei leeren Zellen hab ich jetzt mal weggelassen.)
Gibt es da keine elegantere Möglichkeit mit Daten aus einer Tabelle zu arbeiten?


Und die zweite Frage: kann man sich irgendwie die Zeile ausgeben lassen, in der z.B. ein bestimmtes Datum steht. Da an manchen Tagen kein Eintrag vorhanden ist kann man leider nicht einfach die entsprechende Zeilennummer berechnen.
Eine Möglichkeit wäre eine neue Spalte an die Tabelle anzuhängen die von 1 aufsteigt. Jedoch finde ich das ebenfalls nicht besonders elegant.

bsp.PNG
 Beschreibung:

Download
 Dateiname:  bsp.PNG
 Dateigröße:  9.8 KB
 Heruntergeladen:  13 mal


F.red

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2019, 12:22     Titel:
  Antworten mit Zitat      
OK, ich sollte mich mal wirklich registrieren um meine vorschnell abgesendeten Beiträge auch editieren zu können Wink
 
Jan S
Moderator

Moderator


Beiträge: 10.941
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.06.2019, 18:08     Titel: Re: Frage zu Tabellen
  Antworten mit Zitat      
Hallo F.red,

Code:
daten.Var2=string(daten.Var2);

Ist das wirklich nötig? Welches Format hat die zweite Spalte vorher?

Zitat:
Nur leider kann man mit den Strings so schlecht rechnen. Gibt es eine Möglichkeit die gesamte Spalte einer Tabelle in eine Zahl umzuwandeln?

Was bekommst du mit:
Code:

? Gibt das eine Fehlermeldung?

Zitat:
kann man sich irgendwie die Zeile ausgeben lassen, in der z.B. ein bestimmtes Datum steht.

Kannst du einen Test-Datensatz zur Verfügung stellen? CSV-Files lassen sich auch gezippt hier posten.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.222
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 13.06.2019, 22:25     Titel:
  Antworten mit Zitat      
Hallo,

die Vorgehensweise, als Zeichenkette einzulesen und umzuwandeln, ist ineffizient.

Bitte generell immer die verwendete MATLAB-Version angeben. Ab R2019a gibt es bei detectImportOptions die Option 'DecimalSeparator', die man auf ',' setzen und das Problem recht elegant lösen kann.

Zeile zu einem bestimmten Datum:
Code:
daten(daten.Var1 == datetime(Jahr, Monat, Tag))


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
F.red
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 13.06.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2019, 08:53     Titel:
  Antworten mit Zitat      
Erstmal danke für eure Antworten.


Jan S hat Folgendes geschrieben:
Hallo F.red,
Code:
daten.Var2=string(daten.Var2);

Ist das wirklich nötig? Welches Format hat die zweite Spalte vorher?

Die Zeile mit daten.var2=string ist nicht notwendig um das Dezimaltrennzeichen mittels strrep zu ersetzen. Ich habe jedoch die Umwandlung in einen String vorgenommen, da str2num, das später im Programm folgt sonst nicht funktioniert.
Vor der Umwandlung gibt mir class(daten.Var2) als Antwort cell zurück.


Zitat:

Was bekommst du mit:
Code:

? Gibt das eine Fehlermeldung?

Als Fehlermeldung bekomme ich:
Input must be a character vector or string scalar.

Nur ein einzelnes Element der Tabelle lässt sich mit str2num umwandeln. Da wäre wieder die Frage, wie man sinnvoller mit Zahlen in einer Tabelle arbeitet.




Harald hat Folgendes geschrieben:
Hallo,
die Vorgehensweise, als Zeichenkette einzulesen und umzuwandeln, ist ineffizient.

Bitte generell immer die verwendete MATLAB-Version angeben. Ab R2019a gibt es bei detectImportOptions die Option 'DecimalSeparator', die man auf ',' setzen und das Problem recht elegant lösen kann.

Das meine Vorgehensweise ineffizient ist, habe ich schon vermutet, daher auch meine Nachfrage hier im Forum. Kennst du zufällig gutes Lernmaterial, um einen guten Programmierstil zu lernen?
Meine Matlab-Version ist 2018b


Zitat:
Hallo,
Zeile zu einem bestimmten Datum:
Code:
daten(daten.Var1 == datetime(Jahr, Monat, Tag))



Scheinbar habe ich nicht die richtige syntax benutzt, da er mir z.b. für die Zeile
Code:
daten(daten.Var1 == datetime('2019', '06', '04'))

eine Fehlermeldung ausgibt: Invalid parameter name: 06.
Was jedoch funktioniert
Code:
find(daten.Var1 == datetime('2019-06-04'))


bsp.zip
 Beschreibung:

Download
 Dateiname:  bsp.zip
 Dateigröße:  263 Bytes
 Heruntergeladen:  10 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.222
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 14.06.2019, 09:04     Titel:
  Antworten mit Zitat      
Hallo,

Code:
opts = detectImportOptions('bsp.csv','Delimiter',';');
 opts = setvartype(opts, 2:numel(opts.VariableNames),'double')
 opts = setvaropts(opts, 2:numel(opts.VariableNames), 'DecimalSeparator',',');
 data = readtable('bsp.csv',opts );
 
 data(data.Var1 == datetime(2019, 6, 7),:)


Zu datetime: wenn Jahr, Monat, Tag einzeln angegeben werden, müssen sie numerisch sein - also ohne Hochkomma.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.941
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.06.2019, 19:05     Titel:
  Antworten mit Zitat      
Hallo F.red,

Zitat:
Ich habe jedoch die Umwandlung in einen String vorgenommen, da str2num, das später im Programm folgt sonst nicht funktioniert.

Das bezweifele ich. str2num funktioniert sehr gut mit CHAR Vektoren. Wenn es da ein Problem gab, hat das eine andere Ursache.
Nimm stattdessen str2double , denn das akzeptiert auch Cell Strings.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
F.red
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 13.06.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2019, 09:29     Titel:
  Antworten mit Zitat      
@ Harald mit deinen Einstellungen für readtable funktioniert es wie gewünscht und ist auf jeden Fall besser als nachträglich nochmal die Daten in der Tabelle zu ändern. Da jetzt csvread nicht mehr empfohlen wird muss ich mich mal wirklich intensiver mit readtable auseinander setzen.

Jan S hat Folgendes geschrieben:

Zitat:
Ich habe jedoch die Umwandlung in einen String vorgenommen, da str2num, das später im Programm folgt sonst nicht funktioniert.

Das bezweifele ich. str2num funktioniert sehr gut mit CHAR Vektoren. Wenn es da ein Problem gab, hat das eine andere Ursache.
Nimm stattdessen str2double , denn das akzeptiert auch Cell Strings.


Ja das Problem ist, dass in der Tabelle kein normaler Char gespeichert ist. Aber danke für den Tipp mit str2double. Damit kann ich die gesamte Spalte auf einmal umwandeln und muss nicht wie bei str2num jedes Element einzeln per Schleife verarbeiten.
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2019 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.