MATLAB удаляет наблюдения из расписания, не содержащегося в другом расписании

У меня есть два расписания, в каждом из них по 4 столбца, где меня особенно интересуют первые 2 столбца. Первый столбец — дата, второй — час.

введите здесь описание изображения

Как я могу узнать, какие наблюдения (по дате и часу) есть в расписании 1, но не в расписании 2, и, следовательно, исключить эти наблюдения из моего расписания 1?

Так, например, просто взглянув, я понял, что расписание 1 включает день 25/05/2015 с часами 1 и 2, но расписание 2 не включает их, поэтому я хотел бы удалить эти наблюдения из расписания 1.

Я пытался использовать команду groups_timetable1 = findgroups(timetable1.Date,timetable1.Hour);, но, к сожалению, эта команда мало что говорит вам о том, как различать наблюдения.

Благодарю вас!


person Antoine Fa    schedule 16.04.2020    source источник
comment
рассчитать продолжительность между каждой записью одной таблицы и всеми записями в другой и посмотреть, существует ли запись, продолжительность которой меньше вашего порога   -  person max    schedule 16.04.2020
comment
Спасибо @max, но не могли бы вы развить вашу идею? Как рассчитать продолжительность даты типа datetime? что вы имеете в виду под порогом? Заранее спасибо!   -  person Antoine Fa    schedule 16.04.2020
comment
да я мог. Не могли бы вы предоставить MRE? Порог — это просто количество времени, которое вы хотите оставить, чтобы время по-прежнему считалось равным. 1 секунда, 1 минута, ...   -  person max    schedule 16.04.2020
comment
Какие типы данных есть в вашей таблице? Я предполагаю, что timetable1.Date - это дата и время, но как насчет timetable1.Hour?   -  person Paolo    schedule 16.04.2020
comment
timetable1.Час двойной   -  person Antoine Fa    schedule 16.04.2020


Ответы (2)


вызовите ismember, чтобы найти один набор данных в другом. чтобы найти несколько записей как группу в других составных записях, вы вызываете ismember(..., 'rows').

Например

baseline=[
  100, 2.1
  200, 7.5
  120, 11.0
];
isin=ismember(baseline,[200, 7.5],'rows');
pos=find(isin)

если у вас есть строки времени или объекты datetime, преобразуйте их в числовые значения, например, сначала вызвав datenum или posixtime.

person FangQ    schedule 16.04.2020

Для этого можно использовать метод timetable innerjoin. Вот так:

% Fabricate some data
dates1 = datetime(2015, 5, ones(10,1));
hours1 = (1:10)';
timetable1 = timetable(dates1(:), hours1, rand(10,1), rand(10,1), ...
    'VariableNames', {'Hour', 'Price', 'Volume'});
% Subselect a few rows for timetable2
timetable2 = timetable1([1:3, 6:10],:);

% Use innerjoin to pick rows where Time & Hour intersect:
innerjoin(timetable1, timetable2, 'Keys', {'Time', 'Hour'})

По умолчанию результат innerjoin содержит табличные переменные из обеих входных таблиц - это может быть или не быть тем, что вам нужно.

person Edric    schedule 17.04.2020