exponenta event banner

Очистить расписание с отсутствующими, повторяющимися или неравномерными временами

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

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

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

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

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

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
      ⋮

См. также

| | | | | | | | |

Связанные темы