欠損または重複する時間および非等間隔の時間をもつ timetable の整理
この例では、欠損または重複する時間および非等間隔の時間をもつ timetable から "規則的な" timetable を作成する方法を示します。timetable は table の一種で、データの各行にタイムスタンプ、つまり "行時間" が関連付けられています。規則的な timetable では、行時間が一意であり、一定のタイム ステップの間隔を置いて並べ替えられています。
また、一部のツールボックスには、数値配列形式の等間隔の時系列データに対して機能する関数があります。そのため、この例では、他の関数で使用するために timetable からデータをエクスポートする方法も示します。
行時間には timetable を不規則にする可能性がある多数の問題があります。行時間が欠損している可能性があります。行時間の順序が正しくない可能性があります。行時間は重複し、時間が同じで、同一または異なるデータが含まれている場合がある複数の行が作成される可能性があります。それらが存在し、並べ替えられて一意であっても、サイズの異なるタイム ステップにより変化することがあります。
timetable には、欠損時間、重複する時間または非等間隔の時間を解決したり、データをリサンプリングまたは集計して規則的な行時間を作成するためのさまざまな方法が用意されています。
timetable の読み込み
MAT ファイル badTimes
から、2016 年 6 月 9 日の数時間にわたって取得した気象測定値を含むサンプルの timetable を読み込みます。この timetable 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
欠損行時間をもつ行の検出と削除
開始する 1 つの方法は、行時間として NaT
、つまり欠損値を含む行を見つけて削除することです。行時間のベクトル内にある欠損値を見つけるには、ismissing
を使用します。関数 ismissing
は、TT.Time
が欠損値をもつ位置に 1
を含む logical ベクトルを返します。
natRowTimes = ismissing(TT.Time)
natRowTimes = 12x1 logical array
0
0
0
0
1
0
0
0
0
0
⋮
行時間として欠損値を含まない行のみを保持するには、~natRowTimes
を行インデックスとして使用して、TT
にインデックスを付けます。それらの行を新しい timetable 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
この方法では、欠損行時間をもつ行のみが削除されます。timetable 変数には依然として欠損データ値がある可能性があります。たとえば、goodRowTimesTT
の最後の行で、変数 Rain
と Windspeed
に NaN
値が含まれています。
欠損時間と欠損データをもつ行の削除
代替方法として、関数 rmmissing
を使用して欠損行時間および欠損データ値の両方を同時に削除できます。rmmissing
は、欠損行時間または欠損データ値、あるいはその両方をもつ timetable 行を削除します。
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
欠損行時間または欠損データ値をもつ行をすべて削除します。残りの行を timetable 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
timetable の並べ替えと、規則的な timetable かどうかの判別
欠損値の処理が終わると、次に timetable を並べ替えて、並べ替えられた timetable が規則的であるかどうかを判別することができます。
goodValuesTT
が既に並べ替えられているかを判断するには、関数 issorted
を使用します。
tf = issorted(goodValuesTT)
tf = logical
0
並べ替えられていないため、関数 sortrows
を使用して行時間を基準として timetable を並べ替えます。
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
が規則的かどうかを判別します。規則的な timetable では、連続する行時間の間隔が同じです。並べ替えられた timetable であっても、等間隔でないタイム ステップをもつことがあります。
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
行時間が並べ替えられているため、この結果は、一意の行時間もあれば、重複している行時間もあることを示しています。
重複行の削除
timetable は重複行をもつ場合があります。timetable の行は、行時間とデータ値が同じ場合に重複となります。この例では、sortedTT
の最後の 2 行が重複行です (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
重複する時間と異なるデータをもつ行の検索
timetable には、行時間が重複していてデータ値が異なる行が含まれる場合があります。この例では、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
にインデックスを付けます。時間を基準としてインデックスを付けると、出力 timetable に、行時間が一致するすべての行が含まれます。
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
時間が重複する最初と最後の行の選択
timetable に時間が重複する行がある場合、特定の行を選択して、時間が重複する他の行を破棄できます。たとえば、関数 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
の最後の 2 行は、Temp
変数に異なる値が含まれています。
時間が重複するすべての行のデータの集計
時間が重複する行のデータを処理するもう 1 つの方法は、何らかの方法でデータ値を集計または組み合わせることです。たとえば、同時刻に取得された同じ数量についての複数の測定値の平均値を計算できます。
関数 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
の最後の 2 行では、行時間が重複する行の平均気温が Temp
変数に含まれます。
規則的な timetable の作成
最後に、不規則な timetable のデータをリサンプリングし、関数 retime
を使用して規則的にすることができます。たとえば、meanTT
のデータを内挿して、規則的な 1 時間ごとの時間ベクトルにできます。線形内挿を使用するには、'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
規則的な timetable のデータを配列に抽出
関数で使用するため timetable のデータをエクスポートして、規則的な時間間隔を置いたデータを解析できます。たとえば、Econometrics Toolbox™ および Signal Processing Toolbox™ には、等間隔のデータをさらに解析するための関数が含まれています。
timetable のデータを配列として抽出します。table 変数のデータ型が連結可能である限り、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{:,:}
を使用して timetable 変数のデータにアクセスすることと等しくなります。
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