주요 콘텐츠

누락되거나 중복되거나 불균일하게 분포된 시간값이 포함된 타임테이블 정리하기

이 예제에서는 누락되거나 중복되거나 불균일하게 분포된 시간값이 포함된 타임테이블에서 규칙적인 타임테이블을 만드는 방법을 보여줍니다. 타임테이블은 타임스탬프나 행 시간값을 각 데이터 행과 연결하는 테이블의 한 유형입니다. 규칙적인 타임테이블에서 행 시간값은 고유하고 정렬되어 있으며 스텝 간의 차는 규칙적입니다.

또한, 일부 툴박스에는 숫자형 배열 형태로 된 규칙적인 간격의 시계열 데이터에 대해 작업을 수행하는 함수가 있습니다. 따라서 이 예제에서는 다른 함수에서 사용할 수 있도록 타임테이블에서 데이터를 내보내는 방법도 보여줍니다.

행 시간값과 관련해서 불규칙적인 타임테이블을 유발할 수 있는 몇 가지 문제가 있습니다. 행 시간값이 누락될 수 있습니다. 행 시간값의 순서가 뒤바뀌어 있을 수 있습니다. 행 시간값이 중복될 수 있으며, 이로 인해 동일하거나 다른 데이터를 포함하며 같은 시간으로 된 여러 행이 만들어질 수 있습니다. 또한, 행 시간값이 있고 정렬되어 있으며 고유한 경우에도 행 시간값이 시간 스텝의 크기 차이로 다를 수 있습니다.

타임테이블은 누락되거나 중복되거나 불균일하게 분포된 시간값을 해결하고 규칙적인 행 시간값을 생성하는 데이터를 리샘플링하거나 집계할 수 있는 여러 가지 방법을 제공합니다.

  • 누락된 행 시간값을 찾으려면 ismissing을 사용하십시오.

  • 누락된 시간값과 데이터를 제거하려면 rmmissing을 사용하십시오.

  • 타임테이블을 행 시간값을 기준으로 정렬하려면 sortrows를 사용하십시오.

  • 고유하고 정렬된 행 시간값이 포함된 타임테이블을 만들려면 uniqueretime을 사용하십시오.

  • 중복된 시간값을 제거하려면 고유한 시간으로 구성된 벡터를 지정하고 retime을 사용하십시오.

  • 규칙적인 타임테이블을 만들려면 규칙적인 시간 벡터를 지정하고 retime을 사용하십시오.

Workflow for cleaning timetables with MATLAB functions.

타임테이블 불러오기

2016년 6월 9일에 몇 시간 동안 얻어진 날씨 측정값이 포함된 MAT 파일 badTimes의 샘플 타임테이블을 불러옵니다. 이 타임테이블 TT에는 이날 동안 불규칙적인 시간 간격으로 측정된 기온, 강우량, 풍속 값이 포함되어 있습니다.

load badTimes
TT
TT=12×3 timetable
            Time            Temp    Rain    WindSpeed
    ____________________    ____    ____    _________

    09-Jun-2016 06:01:04      73    0.01       2.3   
    09-Jun-2016 07:59:23      59    0.08       0.9   
    09-Jun-2016 09:53:57      59    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   
    NaT                       56       0         0   
    09-Jun-2016 09:53:57      67    0.03       3.4   
    09-Jun-2016 08:49:10      62    0.01       2.7   
    09-Jun-2016 08:49:10    75.8    0.01       2.7   
    09-Jun-2016 08:49:10      82    0.01       2.7   
    09-Jun-2016 05:03:11    66.2    0.05         3   
    09-Jun-2016 08:49:10    67.2    0.01       2.7   
    09-Jun-2016 04:12:00    58.8     NaN       NaN   

누락된 행 시간값이 있는 행을 찾아 제거하기

한 가지 시작 방법은 행 시간값으로 NaT나 누락값을 가지는 행을 찾아 제거하는 것입니다. 행 시간값으로 구성된 벡터에서 누락값을 찾으려면 ismissing을 사용하십시오. ismissing 함수는 TT.Time에 누락값이 있는 경우마다 1을 포함하는 논리형 벡터를 반환합니다.

natRowTimes = ismissing(TT.Time)
natRowTimes = 12×1 logical array

   0
   0
   0
   0
   1
   0
   0
   0
   0
   0
   0
   0
      ⋮

행 시간값으로 누락값을 갖지 않는 행만 유지하려면 ~natRowTimes를 행 인덱스로 사용하여 TT의 요소를 참조하십시오. 얻어진 행을 새 타임테이블 goodRowTimesTT에 할당합니다.

goodRowTimesTT = TT(~natRowTimes,:)
goodRowTimesTT=11×3 timetable
            Time            Temp    Rain    WindSpeed
    ____________________    ____    ____    _________

    09-Jun-2016 06:01:04      73    0.01       2.3   
    09-Jun-2016 07:59:23      59    0.08       0.9   
    09-Jun-2016 09:53:57      59    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   
    09-Jun-2016 08:49:10      62    0.01       2.7   
    09-Jun-2016 08:49:10    75.8    0.01       2.7   
    09-Jun-2016 08:49:10      82    0.01       2.7   
    09-Jun-2016 05:03:11    66.2    0.05         3   
    09-Jun-2016 08:49:10    67.2    0.01       2.7   
    09-Jun-2016 04:12:00    58.8     NaN       NaN   

이 메서드는 누락된 행 시간값이 있는 행만 제거합니다. 타임테이블 변수는 여전히 누락된 데이터 값을 가질 수 있습니다. 예를 들어, goodRowTimesTT의 마지막 행은 Rain 변수와 Windspeed 변수에 대해 NaN 값을 가집니다.

누락된 시간값과 누락된 데이터가 있는 행 제거하기

다른 방법으로, rmmissing 함수를 사용하여 누락된 행 시간값과 누락된 데이터 값을 동시에 모두 제거할 수 있습니다. rmmissing은 누락된 행 시간값이나 누락된 데이터 값 또는 둘 다 포함된 타임테이블 행을 모두 제거합니다.

TT의 누락된 행 시간값과 누락된 데이터 값을 표시합니다.

TT
TT=12×3 timetable
            Time            Temp    Rain    WindSpeed
    ____________________    ____    ____    _________

    09-Jun-2016 06:01:04      73    0.01       2.3   
    09-Jun-2016 07:59:23      59    0.08       0.9   
    09-Jun-2016 09:53:57      59    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   
    NaT                       56       0         0   
    09-Jun-2016 09:53:57      67    0.03       3.4   
    09-Jun-2016 08:49:10      62    0.01       2.7   
    09-Jun-2016 08:49:10    75.8    0.01       2.7   
    09-Jun-2016 08:49:10      82    0.01       2.7   
    09-Jun-2016 05:03:11    66.2    0.05         3   
    09-Jun-2016 08:49:10    67.2    0.01       2.7   
    09-Jun-2016 04:12:00    58.8     NaN       NaN   

누락된 행 시간값이나 누락된 데이터 값이 있는 행을 모두 제거합니다. 나머지 행을 타임테이블 goodValuesTT에 할당합니다.

goodValuesTT = rmmissing(TT)
goodValuesTT=10×3 timetable
            Time            Temp    Rain    WindSpeed
    ____________________    ____    ____    _________

    09-Jun-2016 06:01:04      73    0.01       2.3   
    09-Jun-2016 07:59:23      59    0.08       0.9   
    09-Jun-2016 09:53:57      59    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   
    09-Jun-2016 08:49:10      62    0.01       2.7   
    09-Jun-2016 08:49:10    75.8    0.01       2.7   
    09-Jun-2016 08:49:10      82    0.01       2.7   
    09-Jun-2016 05:03:11    66.2    0.05         3   
    09-Jun-2016 08:49:10    67.2    0.01       2.7   

타임테이블을 정렬하고 타임테이블이 규칙적인지 확인하기

누락값을 처리한 후, 계속하여 타임테이블을 정렬하고 정렬된 타임테이블이 규칙적인지 확인할 수 있습니다.

goodValuesTT가 이미 정렬되어 있는지 확인하기 위해 issorted 함수를 사용합니다.

tf = issorted(goodValuesTT)
tf = logical
   0

타임테이블이 정렬되어 있지 않으므로 sortrows 함수를 사용하여 행 시간값을 기준으로 타임테이블을 정렬합니다.

sortedTT = sortrows(goodValuesTT)
sortedTT=10×3 timetable
            Time            Temp    Rain    WindSpeed
    ____________________    ____    ____    _________

    09-Jun-2016 05:03:11    66.2    0.05         3   
    09-Jun-2016 06:01:04      73    0.01       2.3   
    09-Jun-2016 07:59:23      59    0.08       0.9   
    09-Jun-2016 08:49:10      62    0.01       2.7   
    09-Jun-2016 08:49:10    75.8    0.01       2.7   
    09-Jun-2016 08:49:10      82    0.01       2.7   
    09-Jun-2016 08:49:10    67.2    0.01       2.7   
    09-Jun-2016 09:53:57      59    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   

sortedTT가 규칙적인지 확인합니다. 규칙적인 타임테이블은 연속된 행 시간값 사이의 시간 간격이 동일합니다. 정렬된 타임테이블인 경우에도 시간 스텝이 균일하지 않을 수 있습니다.

tf = isregular(sortedTT)
tf = logical
   0

타임테이블이 규칙적이지 않으므로 행 시간값 간의 차이를 표시합니다.

diff(sortedTT.Time)
ans = 9×1 duration
   00:57:53
   01:58:19
   00:49:47
   00:00:00
   00:00:00
   00:00:00
   01:04:47
   00:00:00
   00:00:00

행 시간값이 정렬되어 있으므로 이 결과는 행 시간값이 일부는 고유하고 일부는 중복임을 보여줍니다.

중복된 행 제거하기

타임테이블에 중복된 행이 있을 수 있습니다. 타임테이블에서 동일한 행 시간값과 동일한 데이터 값을 가지는 행이 두 개 이상 있는 경우, 타임테이블 행이 중복되었다고 표현합니다. 이 예제에서 sortedTT의 마지막 두 행이 중복된 행입니다. (sortedTT의 다른 행 중에는 행 시간값이 중복이지만 데이터 값이 다른 행도 있습니다.)

sortedTT에서 중복 행을 제거하려면 unique를 사용하십시오. unique 함수는 고유한 행을 반환하고 반환된 행을 행 시간값을 기준으로 정렬합니다.

uniqueRowsTT = unique(sortedTT)
uniqueRowsTT=9×3 timetable
            Time            Temp    Rain    WindSpeed
    ____________________    ____    ____    _________

    09-Jun-2016 05:03:11    66.2    0.05         3   
    09-Jun-2016 06:01:04      73    0.01       2.3   
    09-Jun-2016 07:59:23      59    0.08       0.9   
    09-Jun-2016 08:49:10      62    0.01       2.7   
    09-Jun-2016 08:49:10    67.2    0.01       2.7   
    09-Jun-2016 08:49:10    75.8    0.01       2.7   
    09-Jun-2016 08:49:10      82    0.01       2.7   
    09-Jun-2016 09:53:57      59    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   

중복된 시간값에서 서로 다른 데이터를 가지는 행 찾기

타임테이블에 데이터 값은 다르지만, 행 시간값이 중복된 행이 있을 수 있습니다. 이 예제의 uniqueRowsTT에는 값은 다르지만 행 시간값이 동일한 행이 여러 개 있습니다.

행 시간값이 중복된 행을 찾아 보겠습니다. 먼저, 행 시간값을 정렬한 후 서로 간에 차이가 없는 연속된 시간값을 찾습니다. 서로 간에 차이가 없다면 시간값이 중복된 것입니다. 행 시간값으로 구성된 벡터의 요소에 다시 인덱스를 지정하고 uniqueRowsTT에서 중복된 행 시간값을 식별하는 고유한 시간값의 집합을 반환합니다.

dupTimes = sort(uniqueRowsTT.Time);
tf = (diff(dupTimes) == 0);
dupTimes = dupTimes(tf);
dupTimes = unique(dupTimes)
dupTimes = 2×1 datetime
   09-Jun-2016 08:49:10
   09-Jun-2016 09:53:57

중복된 행 시간값이 있는 행을 표시하려면 dupTimes를 사용하여 uniqueRowsTT의 요소를 참조하십시오. 시간값에 대해 인덱싱하면 출력 타임테이블에 행 시간값이 일치하는 모든 행이 포함됩니다.

uniqueRowsTT(dupTimes,:)
ans=6×3 timetable
            Time            Temp    Rain    WindSpeed
    ____________________    ____    ____    _________

    09-Jun-2016 08:49:10      62    0.01       2.7   
    09-Jun-2016 08:49:10    67.2    0.01       2.7   
    09-Jun-2016 08:49:10    75.8    0.01       2.7   
    09-Jun-2016 08:49:10      82    0.01       2.7   
    09-Jun-2016 09:53:57      59    0.03       3.4   
    09-Jun-2016 09:53:57      67    0.03       3.4   

중복된 시간값이 있는 첫 번째 행과 마지막 행 선택하기

타임테이블에 시간값이 중복된 행이 있는 경우, 특정 행을 선택하고 시간값이 중복된 다른 행은 무시하려고 할 수 있습니다. 예를 들어, unique 함수와 retime 함수를 사용하여 중복된 행 시간값이 있는 첫 번째 행 또는 마지막 행을 선택할 수 있습니다.

먼저, unique를 사용하여 TT에서 고유한 행 시간값으로 구성된 벡터를 만듭니다.

uniqueTimes = unique(uniqueRowsTT.Time)
uniqueTimes = 5×1 datetime
   09-Jun-2016 05:03:11
   09-Jun-2016 06:01:04
   09-Jun-2016 07:59:23
   09-Jun-2016 08:49:10
   09-Jun-2016 09:53:57

중복된 시간값을 가지는 각각의 행 집합에서 첫 번째 행을 선택합니다. 첫 번째 행에서 데이터를 복사하려면 'firstvalue' 메서드를 지정하십시오.

firstUniqueRowsTT = retime(uniqueRowsTT,uniqueTimes,'firstvalue')
firstUniqueRowsTT=5×3 timetable
            Time            Temp    Rain    WindSpeed
    ____________________    ____    ____    _________

    09-Jun-2016 05:03:11    66.2    0.05         3   
    09-Jun-2016 06:01:04      73    0.01       2.3   
    09-Jun-2016 07:59:23      59    0.08       0.9   
    09-Jun-2016 08:49:10      62    0.01       2.7   
    09-Jun-2016 09:53:57      59    0.03       3.4   

중복된 시간값을 가지는 각각의 행 집합에서 마지막 행을 선택합니다. 마지막 행에서 데이터를 복사하려면 'lastvalue' 메서드를 지정하십시오.

lastUniqueRowsTT = retime(uniqueRowsTT,uniqueTimes,'lastvalue')
lastUniqueRowsTT=5×3 timetable
            Time            Temp    Rain    WindSpeed
    ____________________    ____    ____    _________

    09-Jun-2016 05:03:11    66.2    0.05         3   
    09-Jun-2016 06:01:04      73    0.01       2.3   
    09-Jun-2016 07:59:23      59    0.08       0.9   
    09-Jun-2016 08:49:10      82    0.01       2.7   
    09-Jun-2016 09:53:57      67    0.03       3.4   

결과적으로, firstUniqueRowsTTlastUniqueRowsTT의 마지막 두 행은 Temp 변수의 값이 다릅니다.

중복된 시간값이 있는 모든 행에서 데이터 집계하기

중복된 시간값이 있는 행의 데이터를 처리하는 또 다른 방법은 일정한 방식으로 데이터 값을 집계하거나 결합하는 것입니다. 예를 들어, 동시에 측정된 동일한 수량의 여러 값에 대해 평균을 계산할 수 있습니다.

retime 함수를 사용하여 중복된 행 시간값이 있는 행의 평균 기온, 평균 강우량, 평균 풍속을 계산합니다.

meanTT = retime(uniqueRowsTT,uniqueTimes,'mean')
meanTT=5×3 timetable
            Time            Temp     Rain    WindSpeed
    ____________________    _____    ____    _________

    09-Jun-2016 05:03:11     66.2    0.05         3   
    09-Jun-2016 06:01:04       73    0.01       2.3   
    09-Jun-2016 07:59:23       59    0.08       0.9   
    09-Jun-2016 08:49:10    71.75    0.01       2.7   
    09-Jun-2016 09:53:57       63    0.03       3.4   

결과적으로, meanTT의 마지막 두 행의 Temp 변수는 중복된 행 시간값을 가진 행들의 평균 온도가 됩니다.

규칙적인 타임테이블 만들기

마지막으로 불규칙 타임테이블을 규칙적인 타임테이블로 만들기 위해 retime 함수를 사용하여 데이터를 리샘플링할 수 있습니다. 예를 들어, meanTT의 데이터를 규칙적인 시간별 시간 벡터로 보간할 수 있습니다. 선형 보간을 사용하려면 'linear'를 지정하십시오. hourlyTT의 각 행 시간값은 정시에 시작되며, 연속된 행 시간값 사이에는 1시간의 간격이 있습니다.

hourlyTT = retime(meanTT,'hourly','linear')
hourlyTT=6×3 timetable
            Time             Temp       Rain      WindSpeed
    ____________________    ______    ________    _________

    09-Jun-2016 05:00:00    65.826      0.0522     3.0385  
    09-Jun-2016 06:00:00    72.875    0.010737     2.3129  
    09-Jun-2016 07:00:00    66.027    0.044867     1.6027  
    09-Jun-2016 08:00:00    59.158    0.079133     0.9223  
    09-Jun-2016 09:00:00    70.287    0.013344     2.8171  
    09-Jun-2016 10:00:00    62.183    0.031868     3.4654  

'hourly' 같이 미리 정의된 시간 스텝을 사용하는 대신 고유한 시간 스텝을 지정할 수 있습니다. 시간 스텝을 30분으로 지정하려면 'regular' 입력 인수와 'TimeStep' 이름-값 인수를 사용하십시오. 임의 크기의 시간 스텝을 duration형 값 또는 calendarDuration형 값으로 지정할 수 있습니다.

regularTT = retime(meanTT,'regular','linear','TimeStep',minutes(30))
regularTT=11×3 timetable
            Time             Temp       Rain      WindSpeed
    ____________________    ______    ________    _________

    09-Jun-2016 05:00:00    65.826      0.0522     3.0385  
    09-Jun-2016 05:30:00     69.35    0.031468     2.6757  
    09-Jun-2016 06:00:00    72.875    0.010737     2.3129  
    09-Jun-2016 06:30:00    69.576    0.027118     1.9576  
    09-Jun-2016 07:00:00    66.027    0.044867     1.6027  
    09-Jun-2016 07:30:00    62.477    0.062616     1.2477  
    09-Jun-2016 08:00:00    59.158    0.079133     0.9223  
    09-Jun-2016 08:30:00    66.841     0.03695      2.007  
    09-Jun-2016 09:00:00    70.287    0.013344     2.8171  
    09-Jun-2016 09:30:00    66.235    0.022606     3.1412  
    09-Jun-2016 10:00:00    62.183    0.031868     3.4654  

규칙적인 타임테이블 데이터를 배열로 추출하기

함수에 사용할 타임테이블 데이터를 내보내 시간상 규칙적인 간격을 갖는 데이터를 분석할 수 있습니다. 예를 들어, Econometrics Toolbox™와 Signal Processing Toolbox™는 규칙적인 간격의 데이터에 대한 추가 분석에 사용할 수 있는 함수를 제공합니다.

타임테이블 데이터를 배열로 추출합니다. 테이블 변수가 결합될 수 있는 데이터 유형인 경우에 한해, Variables 속성을 사용하여 데이터를 배열로 반환할 수 있습니다.

A = regularTT.Variables
A = 11×3

   65.8260    0.0522    3.0385
   69.3504    0.0315    2.6757
   72.8747    0.0107    2.3129
   69.5764    0.0271    1.9576
   66.0266    0.0449    1.6027
   62.4768    0.0626    1.2477
   59.1579    0.0791    0.9223
   66.8412    0.0370    2.0070
   70.2868    0.0133    2.8171
   66.2348    0.0226    3.1412
   62.1829    0.0319    3.4654
      ⋮

regularTT.Variables는 타임테이블 변수의 데이터에 액세스하기 위해 중괄호 구문 regularTT{:,:}을 사용하는 것과 같습니다.

A2 = regularTT{:,:}
A2 = 11×3

   65.8260    0.0522    3.0385
   69.3504    0.0315    2.6757
   72.8747    0.0107    2.3129
   69.5764    0.0271    1.9576
   66.0266    0.0449    1.6027
   62.4768    0.0626    1.2477
   59.1579    0.0791    0.9223
   66.8412    0.0370    2.0070
   70.2868    0.0133    2.8171
   66.2348    0.0226    3.1412
   62.1829    0.0319    3.4654
      ⋮

참고 항목

| | | | | | | | |

도움말 항목