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