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

21 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
Atsushi Ueno
Atsushi Ueno on 1 Sep 2021
こんにちは
目的を果たすだけなら下記類似質問の採用された回答のような回答にできますが、
下記のvlookup関数をテーブルにも対応するよう拡張する(かつ完全に動作するようテストする)のは時間が掛かります。
どちらが必要ですか?
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
Toru Ikegami
Toru Ikegami on 7 Sep 2021
こんにちは,timetable も色々調べてゆくと奥深いものですね.
① ワークスペースにある変数を使用するのであれば,getfield を使用している部分は不要になります.キーとなる時刻情報の入っているテーブル変数を keyTbl とすると,キーとなる時刻情報は
ts = keyTbl.timestamp_JST;
で取得できます.
② ですが,抽出結果をテーブルで受けて,そのテーブルに抽出されなかった行(時刻エントリ)を追加するという手をつかうというのはどうでしょう.
キー時刻の配列 ts から,データに存在しない時刻を抽出しておきます.
timeNotInData = ts(~ismember(ts, tTbl.timestamp_JST));
データからキー時刻に対応した行を抽出します.
dataTbl = tTbl(ts,:);
抽出されたデータに,NaN を追加します.
dataTbl{timeNotInData,:}=nan;
必要に応じてソートし直します(例).
dataTbl = sortrows(dataTbl,"timestamp_JST","ascend");
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)

Categories

Find more on table in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!