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

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

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

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

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

  • Чтобы найти отсутствующее время строки, используйте ismissing.

  • Чтобы удалить отсутствующее время и данные, используйте rmmissing.

  • Чтобы отсортировать расписание по временам строк, используйте sortrows.

  • Чтобы создать расписание с уникальным и отсортированным временем строки, используйте unique и retime.

  • Чтобы удалить повторяющееся время, задайте вектор уникального времени и используйте retime.

  • Чтобы создать регулярное расписание, задайте регулярный временной вектор и используйте retime.

Загрузка Timetable

Загрузите образец расписания из 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
      ⋮

См. также

| | | | | | | | |

Похожие темы