누락되거나 중복되거나 불균일하게 분포된 시간값이 포함된 타임테이블 정리하기
이 예제에서는 누락되거나 중복되거나 불균일하게 분포된 시간값이 포함된 타임테이블에서 규칙적인 타임테이블을 만드는 방법을 보여줍니다. 타임테이블은 타임스탬프나 행 시간값을 각 데이터 행과 연결하는 테이블의 한 유형입니다. 규칙적인 타임테이블에서 행 시간값은 고유하고 정렬되어 있으며 스텝 간의 차는 규칙적입니다.
또한, 일부 툴박스에는 숫자형 배열 형태로 된 규칙적인 간격의 시계열 데이터에 대해 작업을 수행하는 함수가 있습니다. 따라서 이 예제에서는 다른 함수에서 사용할 수 있도록 타임테이블에서 데이터를 내보내는 방법도 보여줍니다.
행 시간값과 관련해서 불규칙적인 타임테이블을 유발할 수 있는 몇 가지 문제가 있습니다. 행 시간값이 누락될 수 있습니다. 행 시간값의 순서가 뒤바뀌어 있을 수 있습니다. 행 시간값이 중복될 수 있으며, 이로 인해 동일하거나 다른 데이터를 포함하며 같은 시간으로 된 여러 행이 만들어질 수 있습니다. 또한, 행 시간값이 있고 정렬되어 있으며 고유한 경우에도 행 시간값이 시간 스텝의 크기 차이로 다를 수 있습니다.
타임테이블은 누락되거나 중복되거나 불균일하게 분포된 시간값을 해결하고 규칙적인 행 시간값을 생성하는 데이터를 리샘플링하거나 집계할 수 있는 여러 가지 방법을 제공합니다.
타임테이블 불러오기
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
결과적으로, firstUniqueRowsTT
와 lastUniqueRowsTT
의 마지막 두 행은 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
⋮
참고 항목
timetable
| table2timetable
| retime
| issorted
| sortrows
| unique
| diff
| isregular
| rmmissing
| fillmissing