Main Content

欠損または重複する時間および非等間隔の時間をもつ timetable の整理

この例では、欠損または重複する時間および非等間隔の時間をもつ timetable から "規則的な" timetable を作成する方法を示します。timetable は table の一種で、データの各行にタイムスタンプ、つまり "行時間" が関連付けられています。規則的な timetable では、行時間が一意であり、一定のタイム ステップの間隔を置いて並べ替えられています。

また、一部のツールボックスには、数値配列形式の等間隔の時系列データに対して機能する関数があります。そのため、この例では、他の関数で使用するために timetable からデータをエクスポートする方法も示します。

行時間には timetable を不規則にする可能性がある多数の問題があります。行時間が欠損している可能性があります。行時間の順序が正しくない可能性があります。行時間は重複し、時間が同じで、同一または異なるデータが含まれている場合がある複数の行が作成される可能性があります。それらが存在し、並べ替えられて一意であっても、サイズの異なるタイム ステップにより変化することがあります。

timetable には、欠損時間、重複する時間または非等間隔の時間を解決したり、データをリサンプリングまたは集計して規則的な行時間を作成するためのさまざまな方法が用意されています。

  • 欠損している行時間を見つけるには、ismissingを使用します。

  • 欠損している時間およびデータを削除するには、rmmissingを使用します。

  • timetable をその行時間で並べ替えるには、sortrowsを使用します。

  • 一意の並べ替えられた行時間をもつ timetable を作成するには、uniqueretimeを使用します。

  • 重複する時間を削除するには、一意の時間のベクトルを指定して "retime" を使用します。

  • 規則的な timetable を作成するには、規則的な時間ベクトルを指定して "retime" を使用します。

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 の最後の行で、変数 RainWindspeedNaN 値が含まれています。

欠損時間と欠損データをもつ行の削除

代替方法として、関数 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
      ⋮

参考

| | | | | | | | |

関連するトピック