В этом примере показано, как создать регулярное расписание из расписания с отсутствующим, повторяющимся или неравномерным временем. Расписание - это тип таблицы, который связывает метку времени или время строки с каждой строкой данных. В обычном расписании время строк отсортировано и уникально и отличается одним и тем же шагом времени.
Кроме того, некоторые панели инструментов имеют функции, которые работают с регулярно разнесенными данными временных рядов в виде цифровых массивов. В примере также показано, как экспортировать данные из расписания для использования с другими функциями.
Есть ряд проблем со сроками, которые могут сделать расписания нерегулярными. Время строки может отсутствовать. Они могут быть не в порядке. Они могут быть дубликатами, создавая несколько строк с одинаковым временем, которые могут иметь одинаковые или разные данные. И даже когда они присутствуют, сортируются и уникальны, они могут отличаться временными шагами разных размеров.
Расписания предоставляют несколько различных способов устранения отсутствующих, повторяющихся или неравномерных времен и повторной выборки или агрегирования данных для создания регулярных времен строк.
Чтобы найти отсутствующие значения времени строки, используйте ismissing.
Чтобы удалить недостающее время и данные, используйте rmmissing.
Чтобы отсортировать расписание по времени строки, используйте sortrows.
Чтобы составить расписание с уникальным и отсортированным временем строк, используйте unique и retime.
Чтобы удалить повторяющееся время, укажите вектор уникального времени и используйте retime.
Чтобы составить регулярное расписание, укажите вектор регулярного времени и используйте retime.

Загрузить образец расписания из MAT-файла badTimes который содержит измерения погоды, сделанные в течение нескольких часов 9 июня 2016 года. Расписание TT включает измерения температуры, количества осадков и скорости ветра, производимые нерегулярно в течение этого дня.
load badTimes
TTTT=12×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
NaT 56 0 0
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 04:12:00 58.8 NaN NaN
Один из способов начать с поиска и удаления строк, которые имеют NaTили отсутствует значение в качестве времени строки. Чтобы найти отсутствующие значения в векторе времени строки, используйте ismissing. ismissing функция возвращает логический вектор, содержащий 1 везде, где TT.Time имеет отсутствующее значение.
natRowTimes = ismissing(TT.Time)
natRowTimes = 12x1 logical array
0
0
0
0
1
0
0
0
0
0
⋮
Чтобы сохранить только те строки, которые не имеют отсутствующих значений, в качестве времени строки, выполните индексирование в TT использование ~natRowTimes в виде индексов строк. Назначьте эти строки новому расписанию, goodRowTimesTT.
goodRowTimesTT = TT(~natRowTimes,:)
goodRowTimesTT=11×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 04:12:00 58.8 NaN NaN
Этот метод удаляет только строки с отсутствующими временами строк. В переменных расписания по-прежнему могут отсутствовать значения данных. Например, последняя строка goodRowTimesTT имеет NaN значения для Rain и Windspeed переменные.
В качестве альтернативы можно удалить как отсутствующие значения времени строки, так и отсутствующие значения данных одновременно с помощью rmmissing функция. rmmissing удаляет все строки расписания с отсутствующими временами строк, отсутствующими значениями данных или и теми, и другими.
Отображение отсутствующего времени строки и отсутствующих значений данных TT.
TT
TT=12×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
NaT 56 0 0
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 04:12:00 58.8 NaN NaN
Удалите все строки с отсутствующими временами строк или значениями данных. Назначение оставшихся строк расписанию goodValuesTT.
goodValuesTT = rmmissing(TT)
goodValuesTT=10×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 08:49:10 67.2 0.01 2.7
После работы с отсутствующими значениями можно продолжить сортировку расписания, а затем определить, является ли отсортированное расписание регулярным.
Чтобы определить, goodValuesTT уже отсортирован, используйте issorted функция.
tf = issorted(goodValuesTT)
tf = logical
0
Поскольку это не так, отсортируйте расписание по времени его строки с помощью sortrows функция.
sortedTT = sortrows(goodValuesTT)
sortedTT=10×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
Определить, sortedTT является регулярным. Регулярное расписание имеет один и тот же временной интервал между последовательными временами строк. Даже отсортированное расписание может иметь временные шаги, которые не являются едиными.
tf = isregular(sortedTT)
tf = logical
0
Поскольку это не так, просмотрите различия между временами строк.
diff(sortedTT.Time)
ans = 9x1 duration
00:57:53
01:58:19
00:49:47
00:00:00
00:00:00
00:00:00
01:04:47
00:00:00
00:00:00
SInce отсортированы времена строк, этот результат показывает, что некоторые времена строк уникальны, а некоторые являются дубликатами.
Расписания могут иметь дублированные строки. Строки расписания дублируются, если они имеют одинаковое время строки и одинаковые значения данных. В этом примере последние две строки sortedTT являются повторяющимися строками. (Есть и другие строки в sortedTT с повторяющимися временами строк, но различными значениями данных.)
Удаление повторяющихся строк из sortedTT, использовать unique. unique функция возвращает уникальные строки и сортирует их по времени строки.
uniqueRowsTT = unique(sortedTT)
uniqueRowsTT=9×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
Расписания могут содержать строки с повторяющимися временами строк, но различными значениями данных. В этом примере: uniqueRowsTT имеет несколько строк с одинаковыми временами строк, но различными значениями.
Найдите строки с повторяющимися временами строк. Во-первых, сортировка времени строки и поиск последовательных времен, которые не имеют различий между ними. Времена без разницы между ними являются дубликатами. Индексировать обратно в вектор времени строки и возвращать уникальный набор времен, которые идентифицируют повторяющиеся времена строки в uniqueRowsTT.
dupTimes = sort(uniqueRowsTT.Time); tf = (diff(dupTimes) == 0); dupTimes = dupTimes(tf); dupTimes = unique(dupTimes)
dupTimes = 2x1 datetime
09-Jun-2016 08:49:10
09-Jun-2016 09:53:57
Чтобы отобразить строки с повторяющимися временами строк, выполните индексирование в uniqueRowsTT использование dupTimes. При индексации по времени расписание вывода содержит все строки с совпадающими временами строк.
uniqueRowsTT(dupTimes,:)
ans=6×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 08:49:10 67.2 0.01 2.7
09-Jun-2016 08:49:10 75.8 0.01 2.7
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 09:53:57 59 0.03 3.4
09-Jun-2016 09:53:57 67 0.03 3.4
Если расписание содержит строки с повторяющимися временами, можно выбрать определенные строки и удалить другие строки с повторяющимися временами. Например, можно выбрать либо первую, либо последнюю строки с повторяющимися временами строк, используя unique и retime функции.
Сначала создайте вектор уникального времени строки из TT с помощью unique.
uniqueTimes = unique(uniqueRowsTT.Time)
uniqueTimes = 5x1 datetime
09-Jun-2016 05:03:11
09-Jun-2016 06:01:04
09-Jun-2016 07:59:23
09-Jun-2016 08:49:10
09-Jun-2016 09:53:57
Выберите первую строку из каждого набора строк с повторяющимися временами. Чтобы скопировать данные из первых строк, укажите 'firstvalue' способ.
firstUniqueRowsTT = retime(uniqueRowsTT,uniqueTimes,'firstvalue')firstUniqueRowsTT=5×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 62 0.01 2.7
09-Jun-2016 09:53:57 59 0.03 3.4
Выберите последние строки из каждого набора строк с повторяющимися временами. Чтобы скопировать данные из последних строк, укажите 'lastvalue' способ.
lastUniqueRowsTT = retime(uniqueRowsTT,uniqueTimes,'lastvalue')lastUniqueRowsTT=5×3 timetable
Time Temp Rain WindSpeed
____________________ ____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 82 0.01 2.7
09-Jun-2016 09:53:57 67 0.03 3.4
В результате, последние две строки firstUniqueRowsTT и lastUniqueRowsTT имеют различные значения в Temp переменная.
Другой способ обработки данных в строках, имеющих повторяющееся время, состоит в агрегации или объединении значений данных каким-либо образом. Например, можно вычислить средства нескольких измерений одной и той же величины одновременно.
Рассчитайте среднюю температуру, количество осадков и скорость ветра для рядов с повторяющимися временами строк, используя retime функция.
meanTT = retime(uniqueRowsTT,uniqueTimes,'mean')meanTT=5×3 timetable
Time Temp Rain WindSpeed
____________________ _____ ____ _________
09-Jun-2016 05:03:11 66.2 0.05 3
09-Jun-2016 06:01:04 73 0.01 2.3
09-Jun-2016 07:59:23 59 0.08 0.9
09-Jun-2016 08:49:10 71.75 0.01 2.7
09-Jun-2016 09:53:57 63 0.03 3.4
В результате, последние две строки meanTT имеют средние температуры в Temp переменная для строк с повторяющимися временами строк.
Наконец, вы можете повторно отобрать данные из нерегулярного расписания, чтобы сделать его регулярным, используя retime функция. Например, можно интерполировать данные из meanTT на обычный часовой временной вектор. Для использования линейной интерполяции укажите 'linear'. Время каждой строки в hourlyTT начинается с часа, и между последовательными временами строк имеется интервал в один час.
hourlyTT = retime(meanTT,'hourly','linear')
hourlyTT=6×3 timetable
Time Temp Rain WindSpeed
____________________ ______ ________ _________
09-Jun-2016 05:00:00 65.826 0.0522 3.0385
09-Jun-2016 06:00:00 72.875 0.010737 2.3129
09-Jun-2016 07:00:00 66.027 0.044867 1.6027
09-Jun-2016 08:00:00 59.158 0.079133 0.9223
09-Jun-2016 09:00:00 70.287 0.013344 2.8171
09-Jun-2016 10:00:00 62.183 0.031868 3.4654
Вместо использования предопределенного временного шага, например, 'hourly', можно указать собственный шаг времени. Чтобы указать временной шаг в 30 минут, используйте 'regular' входной аргумент и 'TimeStep' аргумент «имя-значение». Можно указать временной шаг любого размера как duration или calendarDuration значение.
regularTT = retime(meanTT,'regular','linear','TimeStep',minutes(30))
regularTT=11×3 timetable
Time Temp Rain WindSpeed
____________________ ______ ________ _________
09-Jun-2016 05:00:00 65.826 0.0522 3.0385
09-Jun-2016 05:30:00 69.35 0.031468 2.6757
09-Jun-2016 06:00:00 72.875 0.010737 2.3129
09-Jun-2016 06:30:00 69.576 0.027118 1.9576
09-Jun-2016 07:00:00 66.027 0.044867 1.6027
09-Jun-2016 07:30:00 62.477 0.062616 1.2477
09-Jun-2016 08:00:00 59.158 0.079133 0.9223
09-Jun-2016 08:30:00 66.841 0.03695 2.007
09-Jun-2016 09:00:00 70.287 0.013344 2.8171
09-Jun-2016 09:30:00 66.235 0.022606 3.1412
09-Jun-2016 10:00:00 62.183 0.031868 3.4654
Можно экспортировать данные расписания для использования с функциями анализа данных, которые регулярно разнесены по времени. Например, Toolbox™ Econometrics и Toolbox™ обработки сигналов имеют функции, которые можно использовать для дальнейшего анализа регулярно разнесенных данных.
Извлеките данные расписания в виде массива. Вы можете использовать Variables для возврата данных в виде массива, если переменные таблицы имеют типы данных, позволяющие их конкатенировать.
A = regularTT.Variables
A = 11×3
65.8260 0.0522 3.0385
69.3504 0.0315 2.6757
72.8747 0.0107 2.3129
69.5764 0.0271 1.9576
66.0266 0.0449 1.6027
62.4768 0.0626 1.2477
59.1579 0.0791 0.9223
66.8412 0.0370 2.0070
70.2868 0.0133 2.8171
66.2348 0.0226 3.1412
⋮
regularTT.Variables эквивалентно использованию синтаксиса фигурной скобки, regularTT{:,:}, для доступа к данным в переменных расписания.
A2 = regularTT{:,:}A2 = 11×3
65.8260 0.0522 3.0385
69.3504 0.0315 2.6757
72.8747 0.0107 2.3129
69.5764 0.0271 1.9576
66.0266 0.0449 1.6027
62.4768 0.0626 1.2477
59.1579 0.0791 0.9223
66.8412 0.0370 2.0070
70.2868 0.0133 2.8171
66.2348 0.0226 3.1412
⋮
diff | fillmissing | isregular | issorted | retime | rmmissing | sortrows | table2timetable | timetable | unique