타임테이블에서 시간값 선택하기
타임테이블은 각 행에 시간값을 연결하는 테이블의 한 유형입니다. 여러 가지 방법으로 시간값에 기반하여 해당 데이터의 일부를 선택할 수 있습니다.
timerange또는withtol함수를 사용하여 특정 범위 내에서 시간값을 찾습니다.datetime형 배열의 성분을 사용하여 일수 또는 월수와 같은 반복되는 시간값 단위를 일치시킵니다.retime함수를 사용하여 데이터를 리샘플링하거나 그룹화합니다.
예를 들어, 2002년~2014년 동안 미국 내의 정전 기록을 나타내는 데이터가 들어 있는 샘플 파일 outages.csv을 읽어오겠습니다. 행 시간값으로 구성된 벡터 OutageTime은 정전이 발생한 시점을 나타냅니다. readtimetable 함수는 이 벡터를 datetime형 배열로 가져옵니다. 텍스트를 string형 배열로 가져오려면 TextType 이름-값 인수를 "string"형으로 지정하십시오.
TT = readtimetable("outages.csv",TextType="string")
TT=1468×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"
2003-06-18 02:49 "West" 0 0 2003-06-18 10:54 "attack"
2004-06-20 14:39 "West" 231.29 NaN 2004-06-20 19:16 "equipment fault"
2002-06-06 19:28 "West" 311.86 NaN 2002-06-07 00:51 "equipment fault"
2003-07-16 16:23 "NorthEast" 239.93 49434 2003-07-17 01:12 "fire"
2004-09-27 11:09 "MidWest" 286.72 66104 2004-09-27 16:37 "equipment fault"
2004-09-05 17:48 "SouthEast" 73.387 36073 2004-09-05 20:46 "equipment fault"
2004-05-21 21:45 "West" 159.99 NaN 2004-05-22 04:23 "equipment fault"
2002-09-01 18:22 "SouthEast" 95.917 36759 2002-09-01 19:12 "severe storm"
2003-09-27 07:32 "SouthEast" NaN 3.5517e+05 2003-10-04 07:02 "severe storm"
2003-11-12 06:12 "West" 254.09 9.2429e+05 2003-11-17 02:04 "winter storm"
2004-09-18 05:54 "NorthEast" 0 0 NaT "equipment fault"
⋮
시간 범위 선택하기
특정 범위의 데이터를 찾으려면 인덱싱에 대해 시간값에 기반한 첨자를 정의하는 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: Starting at, including: 20-Jun-2008 00:00:00 Ending at, but excluding: 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,:)
winterTT=316×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"
2005-03-08 16:37 "SouthEast" 1339.2 4.3003e+05 2005-03-10 20:42 "winter storm"
2002-03-26 01:59 "MidWest" 388.04 5.6422e+05 2002-03-28 19:55 "winter storm"
2003-03-27 08:03 "NorthEast" 204.79 1.479e+05 2003-03-28 05:54 "severe storm"
2003-02-24 06:13 "SouthEast" 0 0 2003-02-24 21:18 "attack"
2002-03-05 17:53 "MidWest" 96.563 2.8666e+05 2002-03-10 14:41 "wind"
2006-01-21 21:27 "SouthEast" 19.513 10994 2006-01-21 23:25 "equipment fault"
2004-01-19 12:37 "MidWest" 16.03 2.2296 2004-01-20 02:50 "equipment fault"
2005-03-01 14:39 "West" 115.47 82611 2005-03-03 05:58 "equipment fault"
2003-01-10 15:38 "West" 185.85 2.757e+05 2003-01-12 05:48 "winter storm"
2004-01-14 20:01 "NorthEast" 87.08 14979 2004-01-16 00:52 "energy emergency"
2004-01-04 10:45 "NorthEast" 145.86 27942 2004-01-08 19:34 "energy emergency"
⋮
겨울철 원인을 나타내는 원형 차트를 만듭니다. 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")
numTT=13×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
2007-01-01 00:00 29112 1.2494e+07
2008-01-01 00:00 34608 1.7608e+07
2009-01-01 00:00 15487 1.1785e+07
2010-01-01 00:00 51543 2.7614e+07
2011-01-01 00:00 34834 1.3614e+07
2012-01-01 00:00 42548 1.8905e+07
2013-01-01 00:00 19572 1.1284e+07
2014-01-01 00:00 0 0
매년 영향을 받은 고객의 수를 나타내는 막대 차트를 만듭니다.
bar(numTT.OutageTime,numTT.Customers) xlabel("Year") ylabel("Customers")

행 시간값을 사용하여 지속 시간 계산하기
다른 datetime형 값 또는 duration형 값을 갖는 타임테이블의 행 시간값을 사용하여 계산을 수행할 수 있습니다. 예를 들어, 정전 데이터에 나열된 정전의 지속 시간을 계산해 보겠습니다. 그런 다음, 정전 지속 시간의 월별 중앙값을 계산하여 플로팅합니다.
먼저, RestorationTime(정전이 종료된 시점)에서 행 시간값(정전이 시작된 시점)을 빼는 방법으로 정전 지속 시간을 구하여 TT에 추가합니다. 정전 지속 시간을 일수로 표시하도록 OutageDuration의 형식을 변경합니다.
TT.OutageDuration = TT.RestorationTime - TT.OutageTime;
TT.OutageDuration.Format = "d"TT=1468×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
2003-06-18 02:49 "West" 0 0 2003-06-18 10:54 "attack" 0.33681 days
2004-06-20 14:39 "West" 231.29 NaN 2004-06-20 19:16 "equipment fault" 0.19236 days
2002-06-06 19:28 "West" 311.86 NaN 2002-06-07 00:51 "equipment fault" 0.22431 days
2003-07-16 16:23 "NorthEast" 239.93 49434 2003-07-17 01:12 "fire" 0.36736 days
2004-09-27 11:09 "MidWest" 286.72 66104 2004-09-27 16:37 "equipment fault" 0.22778 days
2004-09-05 17:48 "SouthEast" 73.387 36073 2004-09-05 20:46 "equipment fault" 0.12361 days
2004-05-21 21:45 "West" 159.99 NaN 2004-05-22 04:23 "equipment fault" 0.27639 days
2002-09-01 18:22 "SouthEast" 95.917 36759 2002-09-01 19:12 "severe storm" 0.034722 days
2003-09-27 07:32 "SouthEast" NaN 3.5517e+05 2003-10-04 07:02 "severe storm" 6.9792 days
2003-11-12 06:12 "West" 254.09 9.2429e+05 2003-11-17 02:04 "winter storm" 4.8278 days
2004-09-18 05:54 "NorthEast" 0 0 NaT "equipment fault" NaN days
⋮
정전 지속 시간만 갖는 타임테이블을 만듭니다. TT의 일부 행에서 복구 시간에 누락값 NaT가 있기 때문에 OutageDuration에 NaN 값이 포함됩니다. medianTT에서 NaN 값을 제거하려면 rmmissing 함수를 사용하십시오. 그런 다음, retime을 사용하여 월별 정전 지속 시간 중앙값을 계산합니다.
medianTT = TT(:,"OutageDuration"); medianTT = rmmissing(medianTT); medianTT = retime(medianTT,"monthly",@median)
medianTT=143×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
2002-07-01 00:00 0.64653 days
2002-08-01 00:00 0.49514 days
2002-09-01 00:00 0.10139 days
2002-10-01 00:00 2.3451 days
2002-11-01 00:00 0.12222 days
2002-12-01 00:00 2.0243 days
2003-01-01 00:00 1.5903 days
2003-02-01 00:00 3.2955 days
2003-03-01 00:00 0.47326 days
2003-04-01 00:00 0.95347 days
2003-05-01 00:00 2.2882 days
⋮
월별 정전 지속 시간 중앙값을 보여주는 계단 차트를 만듭니다.
stairs(medianTT.OutageTime,medianTT.OutageDuration) xlabel("Year") ylabel("Median Duration (days)")

참고 항목
categorical | timetable | retime | timerange | readtimetable | month | withtol | rmmissing | vartype | datetime | duration | NaT