Расписание является типом таблицы, которая связывает время с каждой строкой. Вы можете выбрать основанные на времени подмножества его данных несколькими способами:
Найдите время в определенной области значений с помощью 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