exponenta event banner

Выбор времени в расписании

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

  • Время поиска в определенном диапазоне с помощью 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")

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.

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

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.

См. также

| | | | | | | | | | |

Связанные темы