Выберите Times in Timetable

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

  • Найдите времена в определенном диапазоне с помощью 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.

Выберите Time Range

Чтобы найти данные в определенной области значений, можно использовать 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 object. The axes object contains an object of type stem.

Несколько отключений электричества во время той области значений времени оказали высокое потребительское влияние. Расширьте область значений до периода времени, который охватывает целый год 2 008, и ищите столь же высокие числа.

TR = timerange("2008","years");
all08 = TT(TR,:);
high08 = all08(all08.Customers > 500000,:);

stem(high08.OutageTime,high08.Customers)
ylabel('Customers')

Figure contains an axes object. The axes object 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 object. The axes object 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 object. The axes object contains an object of type stair.

Смотрите также

| | | | | | | | | | |

Похожие темы