LoginSignup
pyonteku
@pyonteku

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

MATLABで日時列があるcsvを読み取りたい

解決したいこと

matlabでreadtableで読み込んだcsvファイルをdatetimeで日時読み取りができないので読み込みできるようにしたいです。

発生している問題・エラー

エラー: datetime (line 659)
入力データは数値配列、string 配列、文字ベクトルを含む cell 配列、または char 行列でなければなりません。出ているエラーメッセージを入力

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

RawData = readtable('2023 1220 15_002.csv');

a=RawData(:,2);
time = RawData(:,1);
t = datetime(time,'inputFormat','HH:mm:ss');

image.png
このような
日時,A,B,,,
のようになっている配列のcsvファイルを読み込めるようにしたいです。
有識者の方よろしくお願いいたします。

0

3Answer

↑こちらによると、自動的に型が判断されるようですが、そうならないのは、日付が無くて時刻だけだから??
インポートオプションを使えば、型やフォーマット、欠損値を指定できるようです。

1Like

Comments

  1. @pyonteku

    Questioner

    nak435さんありがとうございます。
    日付も入れてやったことがあるのですが同じエラーでたんですよね。
    サイト参考にさせていただきます。

MATLAB 環境が無いので、互換の GNU Octave でのコードになります。
Octave には readtable が存在しない(?)ので、MATLAB と Octave に共通な dlmread を使って考えてみました。dlmread は MATLAB では非推奨ですが(^^;)

RawData = dlmread('2023 1220 15_002.csv', ',:', 0, 0);
% ',:' で , と : で分割
% 0, 0 で 0 行、0 列読み飛ばす

% 秒に変換
time = RawData(:,1)*60*60 + RawData(:,2)*60 + RawData(:,3);

(コードブロックの最初の行は「```matlab」となっていますか?)

1Like

Comments

  1. @pyonteku

    Questioner

    Mitz-TADAさんありがとうございます。
    参考にさせて頂きます。
    そのようになっているのですがなぜか色つかないんですよね
    image.png

  2. 一行目のmatlabの後ろについている「言語名」を削除してください。

    t = datetime(DateVectors)に代入するDateVectorsは、m 行 6 列または m 行 3 列の行列
    例: [2014 10 24 12 45 07]
    例: [2014 10 24]
    ということらしいので、次のようなコードでどうでしょうか。ただし、Octave は datetimeを未実装なので、最後の行は未確認です。

    RawData = dlmread('2023 1220 15_002.csv', ',:', 0, 0);
    
    % RawData の行数、列数を求める
    [numRows, numCols] = size(RawData);
    % 日付は同一日と仮定
    d = [2024, 1, 17];
    % d を垂直に numRows 回積み重ねる
    D = repmat(d, numRows, 1);
    % DateVectors の作成
    DV = cat(2, D, RawData(:,1:3));
    % datetime 配列に変換
    t = datetime(DV);
    
  3. @pyonteku

    Questioner

    Mitz-TADAさん何度もありがとうございます。
    やらかしてました。ご指摘ありがとうございます。
    書いていただいたプログラム動かしてみたのですがこのようなエラーがでるのですが
    教えていただけると幸いです。

    エラー: dlmread (line 75)
    DELIMITER は単一の文字でなければなりません。
    
    エラー: ya (line 1)
    RawData = dlmread('2023 1220 15_002.csv',',;', 0 ,0);
    
  4. MATLABは、区切り文字に複数の文字を指定できないようですね。互換のOctaveでは動いたので、MATLABでも大丈夫だと思って記載してしまいました。失礼しました。
    また今度も推測ですが、MATLABではreadmatrixを利用して次のようにすれば良いかもしれません。

    RawData = readmatrix('2023 1220 15_002.csv', "Delimiter", [",", ":"]);
    
    [numRows, numCols] = size(RawData);
    DateVectors = cat(2, repmat([2024, 1, 17], numRows, 1), RawData(:, 1:3));
    t = datetime(DateVectors);
    

    下のページで見ただけなので、今度もダメかもしれません。そのときはごめんなさい。

  5. @pyonteku

    Questioner

    Mitz-TADAさんありがとうございます。
    もともとreadmatrixの知識があったのでそれでやろうとしていたのですが
    このcsv形式ですとreadmatrixでは,出来ないらしくて
    readcellかreadtableみたいなんですけど知識がなく質問したんですよね。
    いえいえとんでもないです。ここまで親切にやっていただきありがとうございます。

  6. MATLAB R2023b の評価版で動くことを確認しました。

    RawData = readmatrix('2023 1220 15_002.csv', "Delimiter", [",", ":"]);
    
    [numRows, numCols] = size(RawData);
    t = datetime([repmat([2024, 1, 17], numRows, 1), RawData(:, 1:3)]);
    d = t - t(1);
    
    Data = RawData(:, 4:end);
    
    figure(1);
    plot(d, Data, '-*', "DurationTickFormat", "s")
    xlabel('time')
    ylabel('distance')
    legend('Car', 'LGV', 'SUV', 'Bus', 'HGV', 'Taxi')
    
    figure(2);
    boxplot(Data)
    xticklabels({'Car','LGV','SUV','Bus','HGV','Taxi'})
    xlabel('category')
    ylabel('distance')
    hold on
    plot(mean(Data, "omitnan"),'+')
    plot(mode(Data),'o')
    hold off
    
  7. @pyonteku

    Questioner

    Mitz-TADAさん本当にありがとうございます。
    前の質問まで見ていただきありがとうございます。
    image.png
    Mitz-TADAさんのおかげで自分のやりたいことが実現できました。
    本当にありがとうございます。
    もしお時間あれば箱ひげ図の方が↓うまく映らないので回答いただけると幸いです。
    image.png

  8. 上のグラフを見ると、データの殆どが600のようにうかがえます。
    そのため、それ以外の値が外れ値になっており、
    600だけで箱ひげ図が作られ下のグラフになったのではと考えます。
    boxplotでは、
    quantile(Data, 0.25) - 1.5 * iqr(Data)より小さい値、
    quantile(Data, 0.75) + 1.5 * iqr(Data)より大きい値が、
    外れ値となります。
    たくさんの異なる値を持つデータで試してみてください。

Mitz-TADAさん本当にありがとうございます。
そうですか。分かりました。色々とありがとうございました。

0Like

Your answer might help someone💌