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

Formatierung Spalte Matrix zu Datum und Sortierung

 

jh4711
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2017, 16:34     Titel: Formatierung Spalte Matrix zu Datum und Sortierung
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine Datenbank, welche in der ersten Spalten Datumsangaben besitzt und in der ersten Reihe Überschriften. Nun möchte ich diese Datenbank nach den Datumangaben in Spalte 1 sortieren (von alt nach neu).

Ein Ausschnitt aus meiner Datenbank:
Code:
>> temp(1:5,1:5)

ans =

  5×5 cell array

    {[       NaN]}    {'AT000000STR1'}    {'AT0000606306'}    {'AT0000642806'}    {'AT0000652011'}
    {'01.01.2007'}    {[         NaN]}    {[    110.6200]}    {[     10.5800]}    {[     54.4400]}
    {'01.01.2008'}    {[         NaN]}    {[     99.2100]}    {[      7.3700]}    {[     45.4500]}
    {'01.01.2009'}    {[         NaN]}    {[     18.4800]}    {[         NaN]}    {[     15.1800]}
    {'01.01.2010'}    {[         NaN]}    {[     37.8300]}    {[      3.8500]}    {[     25.9300]}
 

(Sie scheint in dem Auszug sortiert, beinhaltet allerdings monatliche Daten zum 01.02.2... usw.)


Leider kann ich nicht die komplette erste Spalte als Datum deklarieren:
Code:
>> m1=datetime(temp(:,1),'Inputformat','dd.MM.yyyy');
Error using datetime (line 639)
Input data must be a numeric or a date/time string or a cell array or char matrix containing date/time character vectors.
 


Ich könnte die erste Spalte ab Zeile 2 ausschneiden, formatieren, mit sortrows(..) sortieren und wieder einfügen. Dies scheint mir aber sehr umständlich. Ich bräuchte diese Datenbank mit der Formatierung der ersten Spalte, da ich später explizit auf verschiedenen Daten zugreifen möchte(z.B. vom 01.11.2013 und 01.04.2016). Habt ihr Tipps?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

habe ja gerade auf einen anderen Beitrag geantwortet. Bekommst du nicht einen Table? Tables sind wesentlich angenehmer als solche Cell Arrays.
Wenn du die Daten aus Excel als Table einliest, sollten sie direkt als datetime vorliegen. Dann kannst du mit . auf Spalten zugreifen (wie bei Strukturen auf Felder)

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2017, 20:22     Titel:
  Antworten mit Zitat      
Hallo Harald,

habe Sie über Access geladen. Dort waren sie als Datum angegeben und die dritte Spalte als double, aber keine der Formate wurde übertragen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

dann mach mal
Code:
setdbprefs('DataReturnFormat', 'table')


Kann es sein, dass du mit einer älteren MATLAB-Version arbeitest? Hätte gedacht, dass das schon länger Default ist...

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2017, 20:36     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich verwende Matlab R2017b (64-bit).


Habe einfach mal setdbprefs eingegeben und es kam folgendes:
Code:
>> setdbprefs

ans =

  struct with fields:

    DataReturnFormat: 'cellarray'
       ErrorHandling: 'store'
      NullNumberRead: 'NaN'
     NullNumberWrite: 'NaN'
      NullStringRead: 'null'
     NullStringWrite: 'null'
      FetchInBatches: 'no'
      FetchBatchSize: '1000'
 


Er hat jetzt nach "deinem" Befehl dort table stehen. Vielleicht lag da der Fehler. Ich frage mich, warum dort 'cellarray' als default eingestellt war.

Leider dauern die Funktionen alle was länger. Habe mehrere Millionen Daten. Werde also später berichten. Danke (mal wieder)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.12.2017, 23:04     Titel:
  Antworten mit Zitat      
Hallo,

Empfehlung wäre dann, sich erst mal nur die ersten paar 100 Zeilen zu holen und zu schauen, ob damit alles klappt. Dann auf den großen Datensatz loslassen.

Es ist möglich, dass ich die Einstellung mal vor etlichen Releases gemacht habe und dass es übernommen wurde.

Bei so großen Daten verbietet sich ein Cell Array der ursprünglichen Form selbst, da es einen großen Speicheroverhead hat.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2017, 13:35     Titel:
  Antworten mit Zitat      
Hallo Harald,

irgendwie hat er meine Antwort nicht gesendet. Habe mich gerade etwas gewundert.

Das Problem ist leider nach wie vor, dass meine erste Spalte kein "Datum" ist und auch irgendwie nicht deklariert werden kann. Das brauche ich aber für die Sortierung:

Code:

>> temp=sortrows(temp,1)
>> temp(1:15,1:4)

ans =

  15×4 table

       datum        AT000000STR1    AT0000606306    AT0000642806
    ____________    ____________    ____________    ____________

    '01.01.2007'    []              [110.6200]      [10.5800]  
    '01.01.2008'    []              [ 99.2100]      [ 7.3700]  
    '01.01.2009'    []              [ 18.4800]      []          
    '01.01.2010'    []              [ 37.8300]      [ 3.8500]  
    '01.01.2013'    []              [ 30.1200]      []          
    '01.01.2014'    []              []                   []          
    '01.01.2015'    []              [ 12.5300]      []          
    '01.01.2016'    []              [ 13.6000]      []          
    '01.02.2005'    []              []                   []          
    '01.02.2006'    []              [ 60.9100]      []          
    '01.02.2007'    []              [113.9400]     [11.2600]  
    '01.02.2008'    []              [ 82.0700]      [ 6.2400]  
    '01.02.2010'    []              [ 36.3700]      [ 3.4700]  
    '01.02.2011'    []              [ 41.6600]      []          
    '01.02.2012'    []              [ 26.1600]      []          

>> m1=datetime(temp(:,1),'Inputformat','dd.MM.yyyy');
Error using datetime (line 639)
Input data must be a numeric or a date/time string or a cell array or char matrix containing date/time character vectors.

 


Wie man sieht, sortiert sortrows() zwar, aber erst nach Jahren, dann nach Monaten. Eine Deklarierung schlägt fehl.

Ich habe schon über etliche Funktionen versucht, die erste Spalte in eine Nummer/double zu verwandeln, bekam aber immer Fehlermeldungen

Code:

>> str2num(temp(1,1))
Error using str2num (line 31)
Requires character vector or array input.

>> tem2= cellfun(@str2num,temp(:,1))
Error using cellfun
Input #2 expected to be a cell array, was table instead.

 


Auch eine Umstellung nach Jahr-Monat-Tag zur Sortierung schlägt fehl:
Code:

>> reverse(temp(1:10,1))
Error using reverse (line 42)
First argument must be a string array, character vector, or cell array of character vectors.
 


Dabei ist temp doch eine char-Array:
Code:

>> class temp

ans =

    'char'
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

statt
Code:
m1=datetime(temp(:,1),'Inputformat','dd.MM.yyyy');
 

solltest du
Code:
m1=datetime(temp{:,1},'Inputformat','dd.MM.yyyy');
 
oder noch besser
Code:
m1=datetime(temp.datum,'Inputformat','dd.MM.yyyy');
 
verwenden.

Wenn du nach dem Datum sortieren willst, dann lass es doch im Table:
Code:
temp.datum=datetime(temp.datum,'Inputformat','dd.MM.yyyy');
 

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2017, 10:58     Titel:
  Antworten mit Zitat      
Natürlich klappt es hervorragend... Was eine richtige Klammer so ausmacht.

Danke!
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 - 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.