↑こちらによると、自動的に型が判断されるようですが、そうならないのは、日付が無くて時刻だけだから??
インポートオプションを使えば、型やフォーマット、欠損値を指定できるようです。
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');
このような
日時,A,B,,,
のようになっている配列のcsvファイルを読み込めるようにしたいです。
有識者の方よろしくお願いいたします。
↑こちらによると、自動的に型が判断されるようですが、そうならないのは、日付が無くて時刻だけだから??
インポートオプションを使えば、型やフォーマット、欠損値を指定できるようです。
@pyonteku
Questionernak435さんありがとうございます。
日付も入れてやったことがあるのですが同じエラーでたんですよね。
サイト参考にさせていただきます。
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」となっていますか?)
@pyonteku
Questioner一行目の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);
@pyonteku
QuestionerMitz-TADAさん何度もありがとうございます。
やらかしてました。ご指摘ありがとうございます。
書いていただいたプログラム動かしてみたのですがこのようなエラーがでるのですが
教えていただけると幸いです。
エラー: dlmread (line 75)
DELIMITER は単一の文字でなければなりません。
エラー: ya (line 1)
RawData = dlmread('2023 1220 15_002.csv',',;', 0 ,0);
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);
下のページで見ただけなので、今度もダメかもしれません。そのときはごめんなさい。
@pyonteku
QuestionerMitz-TADAさんありがとうございます。
もともとreadmatrixの知識があったのでそれでやろうとしていたのですが
このcsv形式ですとreadmatrixでは,出来ないらしくて
readcellかreadtableみたいなんですけど知識がなく質問したんですよね。
いえいえとんでもないです。ここまで親切にやっていただきありがとうございます。
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
@pyonteku
Questioner上のグラフを見ると、データの殆どが600のようにうかがえます。
そのため、それ以外の値が外れ値になっており、
600だけで箱ひげ図が作られ下のグラフになったのではと考えます。
boxplot
では、
quantile(Data, 0.25) - 1.5 * iqr(Data)
より小さい値、
quantile(Data, 0.75) + 1.5 * iqr(Data)
より大きい値が、
外れ値となります。
たくさんの異なる値を持つデータで試してみてください。
Mitz-TADAさん本当にありがとうございます。
そうですか。分かりました。色々とありがとうございました。