我在MATLAB中有2个表-表A和表B,每个表的维数不同(行和列的数量不同)。表A的第一列的日期和时间格式为2018-11-01 12:00:00
(DateTime数据格式)。
现在,在表B中,第三列和第四列也由日期和时间组成,格式为2018-11-01 01:11:12:173000
。我想实现的是从表A中删除所有行(即数据实例),在这种情况下,表A的日期时间在表B中的日期和时间之间。 ,假设表B在第一行/第一个数据实例的第三列中为2018-11-10 12:30:00:173
,而在第四列中则为2018-11-10 12:40:00:145
,其中DateTime的条目为DateTime,我想从表A中删除所有数据条目/行(例如,表A的DateTime列值在2018-11-10 12:30:00:173
到2018-11-10 12:40:00:145
的范围内)。这意味着基本上我将从表A中删除上述范围内的数据。
要解决此问题,我想到的第一件事就是使用inner join()
,但从Mathworks社区指南中可以明显看出,innerjoin()
仅与我指定键的确切列值匹配因为,但是在这种情况下,我将查看表B的2列中的DateTime值范围,因此也许这不是最佳方法。为此目的使用for loop
可能会很好,但对于表中的大数据将花费大量的计算时间,这将非常复杂且多余。在这方面的任何帮助将不胜感激。
答案 0 :(得分:2)
我在Mathworks社区页面上收到了对该问题的一些很好的答案,可以在https://uk.mathworks.com/matlabcentral/answers/432509-how-to-remove-table-data-based-on-comparison-between-different-columns-in-another-table-in-matlab?s_tid=prof_contriblnk
上找到答案。我很感谢Guillaume的回答(在上面提到的Mathworks社区页面链接上回答),并将其放在此处以对任何人提供将来的帮助:-
%inputs: TableA with a column named date, TableB with a column named datestart and dateend
%replace by actual table and variable names.
datetocheck = repmat(TableA.date, 1, height(TableB)); %replicate in as many columns as there are rows in B
datestart = repmat(TableB.datestart', height(TableA), 1); %tranpose and replicate in as many rows as in A
dateend = repmat(TableB.dateend', height(TableA), 1);
toremove = any(datetocheck >= datestart & datetocheck <= dateend, 2);
TableA(toremove, :) = [];