В этом примере показано, как создать обычное расписание из того, которое имеет пропавших без вести, копию, или неоднородные времена. Расписание является типом таблицы, которая сопоставляет метку времени, или время строки, с каждой строкой данных. В обычном расписании времена строки сортируются и уникальны, и отличаться тем же шагом постоянного времени.
Кроме того, некоторые тулбоксы имеют функции, которые работают над расположенными с равными интервалами данными временных рядов в форме числовых массивов. Таким образом, пример также показывает, как экспортировать данные из расписания для использования с другими функциями.
Существует много проблем с временами строки, которые могут сделать расписания неправильными. Времена строки могут отсутствовать. Они не могут работать. Они могут быть копиями, создав несколько строк с тем же временем, которое может иметь те же или различные данные. И даже когда они присутствуют, отсортированные и уникальные, они могут отличаться временными шагами различных размеров.
Расписания обеспечивают много различных способов разрешить то, чтобы избегать, копию, или неоднородные времена, и передискретизировать или агрегированные данные, чтобы создать регулярные времена строки.
Чтобы найти недостающие времена строки, используйте 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
. 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
isregular. Обычное расписание имеет тот же временной интервал между временами строки подряд. Даже отсортированное расписание может иметь временные шаги, которые не универсальны.
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
Поскольку времена строки сортируются, этот результат показывает, что несколько раз строки уникальны, и некоторые - копии.
Расписания могут иметь дублирующиеся строки. Строки расписания являются копиями, если у них есть те же времена строки и те же значения данных. В этом примере, последних двух строках 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
Можно экспортировать данные о расписании для использования с функциями, чтобы анализировать данные, которые расположены с равными интервалами вовремя. Например, 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{:,:}
, получить доступ к данным в переменных расписания.
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
⋮
timetable
| table2timetable
| retime
| issorted
| sortrows
| unique
| diff
| isregular
| rmmissing
| fillmissing