Чистое расписание с пропущенными, повторяющимися или неоднородными временами

В этом примере показано, как создать обычное расписание из того, которое имеет пропавших без вести, копию, или неоднородные времена. Расписание является типом таблицы, которая сопоставляет метку времени, или время строки, с каждой строкой данных. В обычном расписании времена строки сортируются и уникальны, и отличаться тем же шагом постоянного времени.

Кроме того, некоторые тулбоксы имеют функции, которые работают над расположенными с равными интервалами данными временных рядов в форме числовых массивов. Таким образом, пример также показывает, как экспортировать данные из расписания для использования с другими функциями.

Существует много проблем с временами строки, которые могут сделать расписания неправильными. Времена строки могут отсутствовать. Они не могут работать. Они могут быть копиями, создав несколько строк с тем же временем, которое может иметь те же или различные данные. И даже когда они присутствуют, отсортированные и уникальные, они могут отличаться временными шагами различных размеров.

Расписания обеспечивают много различных способов разрешить то, чтобы избегать, копию, или неоднородные времена, и передискретизировать или агрегированные данные, чтобы создать регулярные времена строки.

  • Чтобы найти недостающие времена строки, используйте 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   

Выбор First and Last Rows with Duplicate Times

Когда расписание имеет строки с дублирующимися временами, вы можете хотеть выбрать конкретные строки и отбросить другие строки, имеющие дублирующиеся времена. Например, можно выбрать или первое или последнюю из строк с временами дублирующейся строки при помощи 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
      ⋮

Смотрите также

| | | | | | | | |

Похожие темы