如何根据MATLAB中另一个表中不同列之间的比较来删除表数据?

时间:2018-11-28 10:36:51

标签: matlab datetime matlab-table

我在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:1732018-11-10 12:40:00:145的范围内)。这意味着基本上我将从表A中删除上述范围内的数据。

要解决此问题,我想到的第一件事就是使用inner join(),但从Mathworks社区指南中可以明显看出,innerjoin()仅与我指定键的确切列值匹配因为,但是在这种情况下,我将查看表B的2列中的DateTime值范围,因此也许这不是最佳方法。为此目的使用for loop可能会很好,但对于表中的大数据将花费大量的计算时间,这将非常复杂且多余。在这方面的任何帮助将不胜感激。

1 个答案:

答案 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, :) = [];