Main Content

타임테이블에서 시간값 선택하기

타임테이블은 각 행에 시간값을 연결하는 테이블의 한 유형입니다. 여러 가지 방법으로 시간값에 기반하여 해당 데이터의 일부를 선택할 수 있습니다.

  • 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       
    ____________________    _____________    ______    __________    ____________________    ___________________

    01-Feb-2002 12:18:00    {'SouthWest'}    458.98    1.8202e+06    07-Feb-2002 16:50:00    {'winter storm'   }
    23-Jan-2003 00:49:00    {'SouthEast'}    530.14    2.1204e+05                     NaT    {'winter storm'   }
    07-Feb-2003 21:15:00    {'SouthEast'}     289.4    1.4294e+05    17-Feb-2003 08:14:00    {'winter storm'   }
    06-Apr-2004 05:44:00    {'West'     }    434.81    3.4037e+05    06-Apr-2004 06:10:00    {'equipment fault'}
    16-Mar-2002 06:18:00    {'MidWest'  }    186.44    2.1275e+05    18-Mar-2002 23:23:00    {'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:
		  Starting at, including:   20-Jun-2008 00:00:00
		  Ending at, but excluding: 22-Sep-2008 00:00:00

해당 범위에서 발생한 정전을 찾은 후 시간에 따라 영향을 받은 고객의 수를 플로팅합니다.

summer08 = TT(TR,:);
stem(summer08.OutageTime,summer08.Customers)
ylabel("Customers")

Figure contains an axes object. The axes object with ylabel Customers 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 object. The axes object with ylabel Customers contains an object of type stem.

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      
    ____________________    _____________    ______    _________    ____________________    _________________

    26-Jun-2008 22:36:00    {'NorthEast'}    425.21      93612      27-Jun-2008 06:53:00    {'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       
    ____________________    _____________    ______    _________    ____________________    ___________________

    01-Sep-2008 23:35:00    {'SouthEast'}    206.27     2.27e+05                     NaT    {'equipment fault'}
    01-Sep-2008 00:18:00    {'MidWest'  }    510.05        74213    01-Sep-2008 14:07:00    {'thunder storm'  }
    02-Sep-2008 19:01:00    {'MidWest'  }       NaN    2.215e+05    03-Sep-2008 02:58:00    {'severe storm'   }
    29-Aug-2008 20:25:00    {'West'     }       NaN        31624    01-Sep-2008 01:51:00    {'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      
    ____________________    _____________    ______    __________    ____________________    ________________

    01-Feb-2002 12:18:00    {'SouthWest'}    458.98    1.8202e+06    07-Feb-2002 16:50:00    {'winter storm'}
    23-Jan-2003 00:49:00    {'SouthEast'}    530.14    2.1204e+05                     NaT    {'winter storm'}
    07-Feb-2003 21:15:00    {'SouthEast'}     289.4    1.4294e+05    17-Feb-2003 08:14:00    {'winter storm'}
    16-Mar-2002 06:18:00    {'MidWest'  }    186.44    2.1275e+05    18-Mar-2002 23:23:00    {'severe storm'}
    04-Feb-2005 08:18:00    {'MidWest'  }       NaN           NaN    04-Feb-2005 19:51:00    {'attack'      }

겨울철 원인을 나타내는 원형 차트를 만듭니다. pie 함수는 숫자형 또는 categorical형 입력값만 받으므로, 먼저 Causecategorical형으로 변환해야 합니다.

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 
    ___________    _____    __________

    01-Jan-2002    81335    1.3052e+07
    01-Jan-2003    58036     1.396e+07
    01-Jan-2004    51014    1.5523e+07
    01-Jan-2005    33980    8.7334e+06
    01-Jan-2006    35129    2.5729e+07

매년 영향을 받은 고객의 수를 나타내는 막대 차트를 만듭니다.

bar(numTT.OutageTime,numTT.Customers)
xlabel("Year")
ylabel("Customers")

Figure contains an axes object. The axes object with xlabel Year, ylabel Customers contains an object of type bar.

행 시간값을 사용하여 지속 시간 계산하기

다른 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
    ____________________    _____________    ______    __________    ____________________    ___________________    ______________

    01-Feb-2002 12:18:00    {'SouthWest'}    458.98    1.8202e+06    07-Feb-2002 16:50:00    {'winter storm'   }      6.1889 days 
    23-Jan-2003 00:49:00    {'SouthEast'}    530.14    2.1204e+05                     NaT    {'winter storm'   }         NaN days 
    07-Feb-2003 21:15:00    {'SouthEast'}     289.4    1.4294e+05    17-Feb-2003 08:14:00    {'winter storm'   }      9.4576 days 
    06-Apr-2004 05:44:00    {'West'     }    434.81    3.4037e+05    06-Apr-2004 06:10:00    {'equipment fault'}    0.018056 days 
    16-Mar-2002 06:18:00    {'MidWest'  }    186.44    2.1275e+05    18-Mar-2002 23:23:00    {'severe storm'   }      2.7118 days 

정전 지속 시간만 갖는 타임테이블을 만듭니다. TT의 일부 행에서 복구 시간에 누락값 NaT가 있기 때문에 OutageDurationNaN 값이 포함됩니다. medianTT에서 NaN 값을 제거하려면 rmmissing 함수를 사용하십시오. 그런 다음, retime을 사용하여 월별 정전 지속 시간 중앙값을 계산합니다. medianTT의 처음 5개 행을 표시합니다.

medianTT = TT(:,"OutageDuration");
medianTT = rmmissing(medianTT); 
medianTT = retime(medianTT,'monthly',@median);
head(medianTT,5)
    OutageTime     OutageDuration
    ___________    ______________

    01-Feb-2002      6.1889 days 
    01-Mar-2002      2.7472 days 
    01-Apr-2002         NaN days 
    01-May-2002     0.72917 days 
    01-Jun-2002     0.22431 days 

월별 정전 지속 시간 중앙값을 보여주는 계단 차트를 만듭니다.

stairs(medianTT.OutageTime,medianTT.OutageDuration)
xlabel("Year")
ylabel("Median Duration (days)")

Figure contains an axes object. The axes object with xlabel Year, ylabel Median Duration (days) contains an object of type stair.

참고 항목

| | | | | | | | | | |

관련 항목