日時を検索値としてvlookupを使いたい
21 views (last 30 days)
Show older comments
こんにちは。
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
on 1 Sep 2021
こんにちは
目的を果たすだけなら下記類似質問の採用された回答のような回答にできますが、
下記のvlookup関数をテーブルにも対応するよう拡張する(かつ完全に動作するようテストする)のは時間が掛かります。
どちらが必要ですか?
Accepted Answer
Toru Ikegami
on 6 Sep 2021
こんにちは.
vlookup を使わない解をもうひとつ.テーブルをタイムテーブルに変換して使うというのはいかがでしょう.タイムテーブルを使うことで,許容誤差付きなど,わりと柔軟に時刻データを抽出することができます.
データをロードします.(ちょっと小細工をしていますが,これは.mat ファイルの中味の特定の変数を自分の作成した変数に代入するための細工です.変数名 table は table 型変数を作るために使う関数の名前(クラス名)にもなっているので,違う名前 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
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");
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!