Расписание является типом таблицы, которая связывает время с каждой строкой. Вы можете выбрать основанные на времени подмножества его данных несколькими способами:
Найдите время в определенной области значений с помощью 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")
Несколько отключений в течение этой временной области значений оказали большое влияние на клиентов. Расширьте область значений до периода времени, который охватывает весь 2008 год и ищет одинаково высокие цифры.
TR = timerange("2008","years"); all08 = TT(TR,:); high08 = all08(all08.Customers > 500000,:); stem(high08.OutageTime,high08.Customers) ylabel('Customers')

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")

Вы можете использовать время строки расписания с другими 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)")

categorical | datetime | duration | month | NaT | readtimetable | retime | rmmissing | timerange | timetable | vartype | withtol