В этом примере показано, как создать регулярное расписание из того, которое имеет пропущенное, повторяющееся или неоднородное время. Timetable является типом таблицы, которая связывает отметку времени или время строки с каждой строкой данных. В регулярном расписании время строк сортируется и уникально, и отличается одним и тем же регулярным временным шагом.
Кроме того, некоторые тулбоксы имеют функции, которые работают с регулярно разнесенными данными временных рядов в виде числовых массивов. Таким образом, в примере также показано, как экспортировать данные из расписания для использования с другими функциями.
Существует ряд проблем с временами строк, которые могут сделать расписания нерегулярными. Может отсутствовать время строки. Они могут выйти из строя. Они могут быть повторяющимися, создавая несколько строк с тем же временем, которое может иметь те же или другие данные. И даже когда они присутствуют, сортируются, и уникальны, они могут отличаться временными шагами разных размеров.
Timetables предоставляет ряд различных способов разрешить пропущенные, повторяющиеся или неоднородные моменты времени, а также переизбрать или агрегировать данные для создания регулярного времени строк.
Чтобы найти отсутствующее время строки, используйте ismissing
.
Чтобы удалить отсутствующее время и данные, используйте rmmissing
.
Чтобы отсортировать расписание по временам строк, используйте sortrows
.
Чтобы создать расписание с уникальным и отсортированным временем строки, используйте unique
и retime
.
Чтобы удалить повторяющееся время, задайте вектор уникального времени и используйте retime
.
Чтобы создать регулярное расписание, задайте регулярный временной вектор и используйте retime
.
Загрузите образец расписания из MAT-файла badTimes
который содержит измерения погоды, выполненные в течение нескольких часов 9 июня 2016 года. Расписание TT
включает измерения температуры, осадков и скорости ветра, проводимые в нерегулярное время в течение этого дня.
load badTimes
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
Один из способов начать - это найти и удалить строки с NaT
, или отсутствующее значение в качестве времени строки. Чтобы найти отсутствующие значения в векторе времени строки, используйте ismissing
. The 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
В единицах СИ отсортированы строки, этот результат показывает, что некоторые строки уникальны, а некоторые дублируют.
Расписания могут иметь повторяющиеся строки. Строки timetable являются повторяющимися, если они имеют одно и то же время строки и одинаковые значения данных. В этом примере последние две строки sortedTT
являются повторяющимися строками. (Есть другие строки в sortedTT
с повторяющимися временами строк, но различными значениями данных.)
Чтобы удалить повторяющиеся строки из sortedTT
, использовать unique
. The 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
Можно экспортировать данные расписания для использования с функциями для анализа данных, которые регулярно разнесены по времени. Для примера Econometrics Toolbox™ и Signal Processing 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{:,:}
, для доступа к данным в переменных timetable.
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