Хронологические таблицы

Объект типа 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');