日時を検索値としてvlookupを使いたい

11 views (last 30 days)
Yu
Yu on 1 Sep 2021
Commented: Yu on 7 Sep 2021
こんにちは。
timestamp1の日時(検索値)と、
tableの2列目のtimestamp(参照値)と同じ行にあるtarget(抽出値)をvlookupで拾いたいのですが、
「the second parameter must be a string or numeric」とのエラーが出てしまいます。
おそらく、検索値と参照値がdatetime型であるからなのではないかと思うのですが、
どのように修正したらよいかが分かりません。
良い方法をご存知の方がいらっしゃいましたら、ご教示頂けますと嬉しいです。
AA = timestamp1; % 検索したいデータを指定
BB = zeros(size(AA)); % vlookupで拾う変数。検索したいデータのサイズと同じ0のmatrixを作成
CC = table;
k = 1;
for j = 1:length(AA)
v = vlookup(CC, AA(j), 1, 2); % (範囲m,検索値e,mからの取出し列,mの検索列)
if ~isempty(v)
BB(k) = v;
k = k+1;
end
end
  2 Comments
Yu
Yu on 1 Sep 2021
実は、最初のリンクの関数も以前使っていたのですが、for loopで上手く回せないことがあって、2つ目のリンクのものをforと組み合わせて最近使用していました。
なので、forで数万回のループを回せるのであれば、どちらでも大丈夫です。至急必要というわけではないのですが、tableでも使えた方が便利そうですね。
今回は、tableデータゆえのエラーということなのでしょうか? 試しに検索値も参照値もstringにしてみましたが、同じエラーが出てしまいました。 matrixへの変換もdatetimeがあるからなのか上手くいかず詰まってしまいました…。

Sign in to comment.

Accepted Answer

Toru Ikegami
Toru Ikegami on 6 Sep 2021
こんにちは.
vlookup を使わない解をもうひとつ.テーブルをタイムテーブルに変換して使うというのはいかがでしょう.タイムテーブルを使うことで,許容誤差付きなど,わりと柔軟に時刻データを抽出することができます.
データをロードします.(ちょっと小細工をしていますが,これは.mat ファイルの中味の特定の変数を自分の作成した変数に代入するための細工です.変数名 tabletable 型変数を作るために使う関数の名前(クラス名)にもなっているので,違う名前 tbl で受けたいのでこうしました.timestamp1 のほうはついでです.)
tbl = getfiled(load("table.mat"),"table");
ts = getfield(load("timestamp1.mat"),"timestamp1");
タイムテーブルに変換します.
tTbl = table2timetable(tbl,"RowTimes","timestamp_JST");
これで,datetime 型変数を使って希望の時刻のデータを抽出することができます.
data = tTbl.Target(ts(1))
もちろん,一括抽出も可能です.
data = tTbl.Target(ts)
  3 Comments
Yu
Yu on 7 Sep 2021
こんにちは。早速ご回答くださりありがとうございます。
どうしても頂いた最後の
dataTbl{timeNotInData,:}=nan;
がエラーになってしまうため、
timeNotInData = ts(~ismember(ts, tTbl.timestamp_JST));
を参考にさせていただき、
あらかじめ、tTblに存在しないtsの行を削除することで、解決できました。
整理しますと、
% ワークスペースの変数
tbl
ts
①tblに存在しない時間のtsの行を削除
tbl2 = tbl(ts(ismember(ts, tbl.timestamp_JST)));
②tblをtimetableに変換
tTbl = table2timetable(tbl2,"RowTimes","timestamp_JST");
③tsの時間行と一致するTargetをtTblから抽出・挿入
ts.Target = tTbl.Target(ts.timestamp_JST);
とすることで解決いたしました。
何度も丁寧にご回答くださり本当にありがとうございました。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!