타임테이블에서 시간값 선택하기
타임테이블은 각 행에 시간값을 연결하는 테이블의 한 유형입니다. 여러 가지 방법으로 시간값에 기반하여 해당 데이터의 일부를 선택할 수 있습니다.
timerange
또는withtol
함수를 사용하여 특정 범위 내에서 시간값을 찾습니다.datetime
형 배열의 성분을 사용하여 일수 또는 월수와 같은 반복되는 시간값 단위를 일치시킵니다.retime
함수를 사용하여 데이터를 리샘플링하거나 그룹화합니다.
예를 들어, 2002년~2014년 동안 미국 내의 정전 기록을 나타내는 데이터가 들어 있는 샘플 파일 outages.csv
을 읽어오겠습니다. 행 시간값으로 구성된 벡터 OutageTime
은 정전이 발생한 시점을 나타냅니다. readtimetable
함수는 이 벡터를 datetime
형 배열로 가져옵니다. 처음 5개 행을 표시합니다.
TT = readtimetable('outages.csv');
head(TT,5)
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년 여름을 나타내는 범위를 6월 20일~9월 21일로 정의해 보겠습니다. 기본적으로, timerange
는 왼쪽은 닫혀 있고 오른쪽은 열려 있는 반열린 구간을 정의하므로 종료 날짜를 9월 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 Times in Timetable.
해당 범위에서 발생한 정전을 찾은 후 시간에 따라 영향을 받은 고객의 수를 플로팅합니다.
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
형 값의 날짜 성분만 지정하는 경우 시간 성분이 자정으로 설정됩니다. 따라서 6월 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
은 노동절인 9월 1일을 기준으로 3일 이내입니다.
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
형 값의 단위를 사용하여 논리형 인덱싱에 사용할 행을 식별할 수도 있습니다. 이 방법은 주기적 구간을 지정하는 데 유용할 수 있습니다.
예를 들어, 월 성분에 각 연도의 1월, 2월 및 3월에 해당하는 3개 이하의 값이 있는 OutageTime
의 값을 구해 보겠습니다. 결과로 반환된 논리형 배열을 사용하여 TT
의 요소를 참조하십시오.
TR = (month(TT.OutageTime) <= 3); winterTT = TT(TR,:); head(winterTT,5)
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
을 호출하는데 연간(yearly) 간격을 지정하고 sum을 사용하여 여러 값을 합산하도록 합니다. 출력값에는 각 연도에 대해 하나의 행이 포함되며, 이 행에는 해당 연도에 발생한 손실과 영향을 받은 총 고객 수가 포함됩니다.
numTT = TT(:,vartype("numeric")); numTT = retime(numTT,"yearly","sum"); head(numTT,5)
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
형 값을 갖는 타임테이블의 행 시간값을 사용하여 계산을 수행할 수 있습니다. 예를 들어, 정전 데이터에 나열된 정전의 지속 시간을 계산해 보겠습니다. 그런 다음, 정전 지속 시간의 월별 중앙값을 계산하여 플로팅합니다.
먼저, RestorationTime
(정전이 종료된 시점)에서 행 시간값(정전이 시작된 시점)을 빼는 방법으로 정전 지속 시간을 구하여 TT
에 추가합니다. 정전 지속 시간을 일수로 표시하도록 OutageDuration
의 형식을 변경합니다. TT
의 처음 5개 행을 표시합니다.
TT.OutageDuration = TT.RestorationTime - TT.OutageTime;
TT.OutageDuration.Format = 'd';
head(TT,5)
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
가 있기 때문에 OutageDuration
에 NaN
값이 포함됩니다. medianTT
에서 NaN
값을 제거하려면 rmmissing
함수를 사용하십시오. 그런 다음, retime
을 사용하여 월별 정전 지속 시간 중앙값을 계산합니다. medianTT
의 처음 5개 행을 표시합니다.
medianTT = TT(:,"OutageDuration"); medianTT = rmmissing(medianTT); medianTT = retime(medianTT,'monthly',@median); head(medianTT,5)
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
| timetable
| retime
| timerange
| readtimetable
| month
| withtol
| rmmissing
| vartype
| datetime
| duration
| NaT