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