Хронологические таблицы
Объект типа timetable предназначен для хранения представления и обработки табличных данных, предполагая, что каждая строка таблицы связана с меткой времени. Тип timetable объединяет функционал типов timeseries и table.
Создание timetable
>> date_array = datetime(2020,4,1:2:6)';
>> timetable(date_array, [1;2;3], [5;6;7], [8;9;10])
ans =
3×3 timetable
date_array Var1 Var2 Var3
___________ ____ ____ ____
01-Apr-2020 1 5 8
03-Apr-2020 2 6 9
05-Apr-2020 3 7 10
Используя свойство VariableNames можно задать имена столбцов таблицы
>> T1.Properties.VariableNames = {'C1', 'C2', 'C3'};
>> T1
T1 =
3×3 timetable
date_array C1 C2 C3
___________ __ __ __
01-Apr-2020 1 5 8
02-Apr-2020 2 6 9
03-Apr-2020 3 7 10
Свойство Variables позволяет получить матрицу данных таблицы. Для созданной выше таблицы T1 это будет
>> T1.Variables
ans =
1 5 8
2 6 9
3 7 10
Объект timetable может содержать столбцы любого типа
>> T2 = timetable(date_array, [1;2;3], [5;6;7], {'A';'B';'C'})
T2 =
3×3 timetable
date_array Var1 Var2 Var3
___________ ____ ____ ____
01-Apr-2020 1 5 'A'
03-Apr-2020 2 6 'B'
05-Apr-2020 3 7 'C'
Извлечение данных при помощи свойства Variables из такой таблицы приведёт к ошибке
...
Unable to concatenate the table variables 'Var1' and 'Var3', because their types are double and cell.
Объект timetable можно создать на основе объекта table
>> SBER_table = readtable('SBRCY.csv');
>> table2timetable(SBER_table);
В таблице должен быть хотя бы один столбец, имеющий тип DateTime. Первый столбец в таблице, который имеет тип DateTime, используется для меток времени
t0 = table((1:5)',(10:10:50)',(hours(0):hours(1):hours(4))')
t1 = table2timetable(t0)
Функции timetable
retime
Функция retime используется для пересчета значений timetable в новой шкале времени.
Например, рассмотрим таблицу, содержащую 3 строки, соответствующие трём датам: 1, 3 и 5 апреля 2020 года:
>> date_array = datetime(2020,4,1:2:6)';
>> T1 = timetable(date_array, [1;2;3], [5;6;7], [10;15;8])
T1 =
3×3 timetable
date_array Var1 Var2 Var3
___________ ____ ____ ____
01-Apr-2020 1 5 10
03-Apr-2020 2 6 15
05-Apr-2020 3 7 8
На основе этой таблицы создадим таблицу TR с шагом по времени 1 день. Для этого можно вторым аргументом явно указать в функции retime новый массив дат
>> TR = retime(T1,datetime(2020,4,1:1:6)')
TR =
6×3 timetable
date_array Var1 Var2 Var3
___________ ____ ____ ____
01-Apr-2020 1 5 10
02-Apr-2020 NaN NaN NaN
03-Apr-2020 2 6 15
04-Apr-2020 NaN NaN NaN
05-Apr-2020 3 7 8
06-Apr-2020 NaN NaN NaN
Как видно, для новых значений времени, которых не было в исходной таблице, данных не появилось. Чтобы новая таблица содержала значения в столбцах для новых дат, необходимо третим аргументом указать тип интерполяции, например, линейная (‘linear’), сплайн (‘spline’), следующее значение (‘next’):
>> T2 = retime(T1,datetime(2020,4,1:1:6)','linear')
T2 =
6×3 timetable
date_array Var1 Var2 Var3
___________ ____ ____ ____
01-Apr-2020 1 5 10
02-Apr-2020 1.5 5.5 12.5
03-Apr-2020 2 6 15
04-Apr-2020 2.5 6.5 11.5
05-Apr-2020 3 7 8
06-Apr-2020 3.5 7.5 4.5
Если новый массив времени содержит меньшее количество точек, то вместо интерполяции используются агрегатные функции (среднее, минимум, максимум).
x = linspace(0,5,50);
VAR1 = 2*x + sin(x);
VAR2 = cos(x);
T1 = timetable(seconds(x)',VAR1',VAR2');
plot(T1.Time,T1.Var1,'-', T1.Time,T1.Var2, '--');
hold on;
x2 = linspace(0,5,10);
T2 = retime(T1,seconds(x2)','nearest');
plot(T2.Time,T2.Var1,'o', T2.Time,T2.Var2, '^');
hold off;
legend('Var1','Var2','retime Var1','retime Var2');