Выберите время в Timetable

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

  • Найдите время в определенной области значений с помощью timerange или withtol функций.

  • Совпадайте с повторяющимися модулями времени, такими как дни или месяцы, используя компоненты datetime массивы.

  • Повторная выборка или группировка данных с retime функция.

Для примера прочитайте образец файла outages.csv, содержащая данные, представляющие отключения электрической утилиты в Соединенных Штатах Америки от 2002-2014. Вектор времени строки, OutageTime, указывает, когда произошли отключения. The readtimetable функция импортирует его как datetime массив. Отобразите первые пять строк.

TT = readtimetable('outages.csv');
head(TT,5)
ans=5×5 timetable
       OutageTime          Region         Loss     Customers     RestorationTime            Cause       
    ________________    _____________    ______    __________    ________________    ___________________

    2002-02-01 12:18    {'SouthWest'}    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'   }
    2003-01-23 00:49    {'SouthEast'}    530.14    2.1204e+05                 NaT    {'winter storm'   }
    2003-02-07 21:15    {'SouthEast'}     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'   }
    2004-04-06 05:44    {'West'     }    434.81    3.4037e+05    2004-04-06 06:10    {'equipment fault'}
    2002-03-16 06:18    {'MidWest'  }    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'   }

Перед R2019a считайте табличные данные с readtable и преобразовать его в расписание с помощью table2timetable.

Выбор временной области значений

Чтобы найти данные в определенной области значений, можно использовать timerange функция, которая задает основанные на времени индексы для индексации. Например, определить область значений на лето 2008 года, который начался 20 июня и закончился 21 сентября. По умолчанию timerange задает полуоткрытый интервал, который закрывается слева и открывается справа, поэтому укажите дату окончания как 22 сентября.

TR = timerange("2008-06-20","2008-09-22")
TR = 
	timetable timerange subscript:

		Select timetable rows with times in the half-open interval:
		[20-Jun-2008 00:00:00, 22-Sep-2008 00:00:00)

	See Select Timetable Data by Row Time and Variable Type.

Найдите отключения, которые произошли в этой области значений, и затем постройте график количества пострадавших клиентов с течением времени.

summer08 = TT(TR,:);
stem(summer08.OutageTime,summer08.Customers)
ylabel("Customers")

Figure contains an axes. The axes contains an object of type stem.

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

TR = timerange("2008","years");
all08 = TT(TR,:);
high08 = all08(all08.Customers > 500000,:);

stem(high08.OutageTime,high08.Customers)
ylabel('Customers')

Figure contains an axes. The axes contains an object of type stem.

The timerange функция также полезна для выбора конкретных дат. Выбор времени путем сравнения datetime значения могут дать вводящие в заблуждение результаты, потому что все datetime значения включают как компоненты даты, так и компоненты времени. Однако, когда вы задаете только компонент даты datetime значение, временной компонент установлен на полночь. Поэтому, хотя есть данные от 26 июня, сравнение, подобное этому, не возвращает результатов.

any(summer08.OutageTime == datetime("2008-06-26"))
ans = logical
   0

Вместо этого можно использовать timerange.

TR = timerange("2008-06-26","days");
june26 = summer08(TR,:)
june26=1×5 timetable
       OutageTime          Region         Loss     Customers    RestorationTime           Cause      
    ________________    _____________    ______    _________    ________________    _________________

    2008-06-26 22:36    {'NorthEast'}    425.21      93612      2008-06-27 06:53    {'thunder storm'}

Другой способ задать область значений - задать допуск примерно в то же время, используя withtol. Например, найдите строки с лета 2008 года, где OutageTime находится в течение трех дней после Дня труда, 1 сентября.

WT = withtol("2008-09-01",days(3));
nearSep1 = summer08(WT,:)
nearSep1=4×5 timetable
       OutageTime          Region         Loss     Customers    RestorationTime            Cause       
    ________________    _____________    ______    _________    ________________    ___________________

    2008-09-01 23:35    {'SouthEast'}    206.27     2.27e+05                 NaT    {'equipment fault'}
    2008-09-01 00:18    {'MidWest'  }    510.05        74213    2008-09-01 14:07    {'thunder storm'  }
    2008-09-02 19:01    {'MidWest'  }       NaN    2.215e+05    2008-09-03 02:58    {'severe storm'   }
    2008-08-29 20:25    {'West'     }       NaN        31624    2008-09-01 01:51    {'wind'           }

Совпадение модулей времени

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

Для примера найдите значения OutageTime компоненты которого имеют значения 3 или менее, соответствующие январю, февралю и марту каждого года. Используйте получившийся логический массив для индекса в TT.

TR = (month(TT.OutageTime) <= 3);
winterTT = TT(TR,:);

head(winterTT,5)
ans=5×5 timetable
       OutageTime          Region         Loss     Customers     RestorationTime          Cause      
    ________________    _____________    ______    __________    ________________    ________________

    2002-02-01 12:18    {'SouthWest'}    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'}
    2003-01-23 00:49    {'SouthEast'}    530.14    2.1204e+05                 NaT    {'winter storm'}
    2003-02-07 21:15    {'SouthEast'}     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'}
    2002-03-16 06:18    {'MidWest'  }    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'}
    2005-02-04 08:18    {'MidWest'  }       NaN           NaN    2005-02-04 19:51    {'attack'      }

Составьте круговую диаграмму причин зимнего времени. The pie функция принимает только число или categorical входы, поэтому сначала преобразуйте Cause на categorical.

winterTT.Cause = categorical(winterTT.Cause);
pie(winterTT.Cause)
title("Causes of Outages, January to March");

Группирование по периодам времени

The retime функция настраивает время строки, чтобы создать заданные интервалы, путем повторной дискретизации или группирования значений. Его предопределенные интервалы варьируются от секунд до лет, и можно задать, как обрабатывать отсутствующие или несколько значений для интервалов. Например, можно выбрать первое наблюдение из каждой недели или подсчитать наблюдения за квартал.

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

numTT = TT(:,vartype("numeric"));
numTT = retime(numTT,"yearly","sum");
head(numTT,5)
ans=5×2 timetable
       OutageTime       Loss     Customers 
    ________________    _____    __________

    2002-01-01 00:00    81335    1.3052e+07
    2003-01-01 00:00    58036     1.396e+07
    2004-01-01 00:00    51014    1.5523e+07
    2005-01-01 00:00    33980    8.7334e+06
    2006-01-01 00:00    35129    2.5729e+07

Создание столбчатой диаграммы количества клиентов, затрагиваемых каждый год.

bar(numTT.OutageTime,numTT.Customers)
xlabel("Year")
ylabel("Customers")

Figure contains an axes. The axes contains an object of type bar.

Вычисление длительности с использованием времени строки

Вы можете использовать время строки расписания с другими datetime или duration значения для выполнения вычислений. Например, вычислите сроки отключения электроэнергии, перечисленные в данных об отключении. Затем вычислите месячные медианы длительности отключения и постройте их график.

Сначала добавьте продолжительность отключения к TT путем вычитания времени строки (которые являются началом отключения степени) из RestorationTime (которые являются концами отключения электроэнергии). Изменение формата OutageDuration отображение продолжительности отключений в днях. Отображение первых пяти строк TT.

TT.OutageDuration = TT.RestorationTime - TT.OutageTime;
TT.OutageDuration.Format = 'd';
head(TT,5)
ans=5×6 timetable
       OutageTime          Region         Loss     Customers     RestorationTime            Cause           OutageDuration
    ________________    _____________    ______    __________    ________________    ___________________    ______________

    2002-02-01 12:18    {'SouthWest'}    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'   }      6.1889 days 
    2003-01-23 00:49    {'SouthEast'}    530.14    2.1204e+05                 NaT    {'winter storm'   }         NaN days 
    2003-02-07 21:15    {'SouthEast'}     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'   }      9.4576 days 
    2004-04-06 05:44    {'West'     }    434.81    3.4037e+05    2004-04-06 06:10    {'equipment fault'}    0.018056 days 
    2002-03-16 06:18    {'MidWest'  }    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'   }      2.7118 days 

Составьте расписание, которое имеет только продолжительность отключения. Некоторые строки TT иметь отсутствующие значения, NaT, для времени реставрации, ведущей к NaN значения в OutageDuration. Чтобы удалить NaN значения из medianTT, используйте rmmissing функция. Затем используйте retime для вычисления месячной медианной длительности отключения. Отображение первых пяти строк medianTT.

medianTT = TT(:,"OutageDuration");
medianTT = rmmissing(medianTT); 
medianTT = retime(medianTT,'monthly',@median);
head(medianTT,5)
ans=5×1 timetable
       OutageTime       OutageDuration
    ________________    ______________

    2002-02-01 00:00      6.1889 days 
    2002-03-01 00:00      2.7472 days 
    2002-04-01 00:00         NaN days 
    2002-05-01 00:00     0.72917 days 
    2002-06-01 00:00     0.22431 days 

Составьте ступенчатый график продолжительности ежемесячного отключения.

stairs(medianTT.OutageTime,medianTT.OutageDuration)
xlabel("Year")
ylabel("Median Duration (days)")

Figure contains an axes. The axes contains an object of type stair.

См. также

| | | | | | | | | | |

Похожие темы