Расписание - это тип таблицы, который связывает время с каждой строкой. Можно выбрать зависящие от времени подмножества его данных несколькими способами:
Время поиска в определенном диапазоне с помощью timerange или withtol функции.
Сопоставление повторяющихся единиц времени, таких как дни или месяцы, с использованием компонентов datetime массивы.
Повторная выборка или группировка данных с помощью retime функция.
Например, прочитайте образец файла outages.csv, содержащий данные, представляющие отключения электроэнергии в Соединенных Штатах из 2002-2014. Вектор времени строки, OutageTime, указывает, когда произошли отключения. 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')

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' }
Создайте круговую диаграмму причин зимы. pie функция принимает только числовые или categorical входные данные, поэтому сначала преобразуйте Cause кому categorical.
winterTT.Cause = categorical(winterTT.Cause);
pie(winterTT.Cause)
title("Causes of Outages, January to March");
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