Main Content

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

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

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

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

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

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

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

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

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

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

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

타임테이블 불러오기

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 = 12x1 logical array

   0
   0
   0
   0
   1
   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 = 9x1 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 = 2x1 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 = 5x1 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
      ⋮

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
      ⋮

참고 항목

| | | | | | | | |

관련 항목