Main Content

timetable での時間の選択

timetable は table の一種で、各行に時刻が関連付けられています。データの時間ベースのサブセットは次の複数の方法で選択できます。

  • 関数 timerange または関数 withtol を使用して特定の範囲内で時間を検索する。

  • 配列 datetime のコンポーネントを使用して、日や月などの繰り返し発生する時間単位を一致させる。

  • 関数 retime を使用してデータをリサンプリングまたはグループ化する。

たとえば、米国における 2002 ~ 2014 年の電力会社の停電を表すデータが含まれるサンプル ファイル outages.csv を読み取ります。行時間のベクトル OutageTime は、停電が発生した時期を示しています。関数 readtimetable はそれを配列 datetime としてインポートします。最初の 5 行を表示します。

TT = readtimetable('outages.csv');
head(TT,5)
       OutageTime          Region         Loss     Customers     RestorationTime            Cause       
    ________________    _____________    ______    __________    ________________    ___________________

    2002-02-01 12:18    {'SouthWest'}    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'   }
    2003-01-23 00:49    {'SouthEast'}    530.14    2.1204e+05                 NaT    {'winter storm'   }
    2003-02-07 21:15    {'SouthEast'}     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'   }
    2004-04-06 05:44    {'West'     }    434.81    3.4037e+05    2004-04-06 06:10    {'equipment fault'}
    2002-03-16 06:18    {'MidWest'  }    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'   }

"R2019a より前" では、表形式データをreadtableで読み取り、table2timetableを使用して timetable に変換します。

時間範囲の選択

特定の範囲内でデータを検索する場合、関数 timerange を使用できます。この関数はインデックス付けに対する時間ベースの添字を定義します。たとえば、6 月 20 日から開始して 9 月 21 日に終了する 2008 年の夏季の範囲を定義します。既定では、timerange は左閉右開の半開区間を定義するため、終了日を 9 月 22 日として指定します。

TR = timerange("2008-06-20","2008-09-22")
TR = 
	timetable timerange subscript:

		Select timetable rows with times in the half-open interval:
		  Starting at, including:   20-Jun-2008 00:00:00
		  Ending at, but excluding: 22-Sep-2008 00:00:00

この範囲で発生した停電を見つけて、影響を受けた顧客の数を経時的にプロットします。

summer08 = TT(TR,:);
stem(summer08.OutageTime,summer08.Customers)
ylabel("Customers")

Figure contains an axes object. The axes object with ylabel Customers contains an object of type stem.

その時間範囲中に発生した複数の停電は、顧客に大きく影響しています。範囲を 2008 年全体にわたる期間に拡張し、同様に高い数値を探します。

TR = timerange("2008","years");
all08 = TT(TR,:);
high08 = all08(all08.Customers > 500000,:);

stem(high08.OutageTime,high08.Customers)
ylabel('Customers')

Figure contains an axes object. The axes object with ylabel Customers contains an object of type stem.

関数 timerange は特定の日付を選択する際にも役立ちます。すべての datetime 値には日付と時刻の両方のコンポーネントが含まれているため、datetime 値を比較して時間を選択すると、誤解を招く結果が返される場合があります。ただし、datetime 値の日付のコンポーネントのみを指定すると、時刻のコンポーネントは午前 0 時に設定されます。このため、6 月 26 日のデータはありますが、このような比較からは結果が返されません。

any(summer08.OutageTime == datetime("2008-06-26"))
ans = logical
   0

代わりに、timerange を使用できます。

TR = timerange("2008-06-26","days");
june26 = summer08(TR,:)
june26=1×5 timetable
       OutageTime          Region         Loss     Customers    RestorationTime           Cause      
    ________________    _____________    ______    _________    ________________    _________________

    2008-06-26 22:36    {'NorthEast'}    425.21      93612      2008-06-27 06:53    {'thunder storm'}

範囲を定義する別の方法は、withtol を使用して時間の周辺に許容誤差を指定することです。たとえば、2008 年の夏から、OutageTime が労働者の日 (9 月 1 日) の 3 日間以内である行を見つけます。

WT = withtol("2008-09-01",days(3));
nearSep1 = summer08(WT,:)
nearSep1=4×5 timetable
       OutageTime          Region         Loss     Customers    RestorationTime            Cause       
    ________________    _____________    ______    _________    ________________    ___________________

    2008-09-01 23:35    {'SouthEast'}    206.27     2.27e+05                 NaT    {'equipment fault'}
    2008-09-01 00:18    {'MidWest'  }    510.05        74213    2008-09-01 14:07    {'thunder storm'  }
    2008-09-02 19:01    {'MidWest'  }       NaN    2.215e+05    2008-09-03 02:58    {'severe storm'   }
    2008-08-29 20:25    {'West'     }       NaN        31624    2008-09-01 01:51    {'wind'           }

時間の単位の一致

論理インデックス付けの行を特定するために、時間や日などの datetime 値の単位も使用できます。この方法は周期的な区間を指定する場合に便利です。

たとえば、各年の 1 月、2 月、3 月に対応する、月のコンポーネントが 3 以下である OutageTime の値を見つけます。結果の logical 配列を使用して TT にインデックスを付けます。

TR = (month(TT.OutageTime) <= 3);
winterTT = TT(TR,:);

head(winterTT,5)
       OutageTime          Region         Loss     Customers     RestorationTime          Cause      
    ________________    _____________    ______    __________    ________________    ________________

    2002-02-01 12:18    {'SouthWest'}    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'}
    2003-01-23 00:49    {'SouthEast'}    530.14    2.1204e+05                 NaT    {'winter storm'}
    2003-02-07 21:15    {'SouthEast'}     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'}
    2002-03-16 06:18    {'MidWest'  }    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'}
    2005-02-04 08:18    {'MidWest'  }       NaN           NaN    2005-02-04 19:51    {'attack'      }

冬季の原因の円グラフを作成します。関数 pie は数値または categorical 入力しか受け入れないため、最初に Causecategorical に変換します。

winterTT.Cause = categorical(winterTT.Cause);
pie(winterTT.Cause)
title("Causes of Outages, January to March");

Figure contains an axes object. The hidden axes object with title Causes of Outages, January to March contains 16 objects of type patch, text. These objects represent attack, energy emergency, equipment fault, severe storm, thunder storm, unknown, wind, winter storm.

期間でのグループ化

関数 retime は、値のリサンプリングまたはグループ化のいずれかにより、行時間を調整して指定された区間を作成します。その事前定義された区間は秒から年の範囲にわたり、区間の欠損値または複数の値を処理する方法を指定できます。たとえば、各週から最初の観測値を選択したり、1 四半期の観測値をカウントしたりできます。

停電データについては、retime を使用して各年の合計を求めることができます。最初に、数値変数のみを使用して timetable を作成します。次に、retime を呼び出し、sum を使用して複数の値を結合し、年次区間を指定します。出力には年ごとに 1 つの行が存在し、その年に影響を受けた総損失と顧客の総数が含まれます。

numTT = TT(:,vartype("numeric"));
numTT = retime(numTT,"yearly","sum");
head(numTT,5)
       OutageTime       Loss     Customers 
    ________________    _____    __________

    2002-01-01 00:00    81335    1.3052e+07
    2003-01-01 00:00    58036     1.396e+07
    2004-01-01 00:00    51014    1.5523e+07
    2005-01-01 00:00    33980    8.7334e+06
    2006-01-01 00:00    35129    2.5729e+07

各年に影響を受けた顧客の数の棒グラフを作成します。

bar(numTT.OutageTime,numTT.Customers)
xlabel("Year")
ylabel("Customers")

Figure contains an axes object. The axes object with xlabel Year, ylabel Customers contains an object of type bar.

行時間を使用した継続期間の計算

timetable の行時間をその他の datetime 値または duration 値とともに使用して計算を実行できます。たとえば、停電データにリストされた停電の継続期間を計算します。次に、停電期間の月次中央値を計算してプロットします。

最初に、RestorationTime (停電の終了) から行時間 (停電の開始) を減算して停電期間を TT に追加します。OutageDuration の形式を変更して、停電の継続期間を日数で表示します。TT の最初の 5 行を表示します。

TT.OutageDuration = TT.RestorationTime - TT.OutageTime;
TT.OutageDuration.Format = 'd';
head(TT,5)
       OutageTime          Region         Loss     Customers     RestorationTime            Cause           OutageDuration
    ________________    _____________    ______    __________    ________________    ___________________    ______________

    2002-02-01 12:18    {'SouthWest'}    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'   }      6.1889 days 
    2003-01-23 00:49    {'SouthEast'}    530.14    2.1204e+05                 NaT    {'winter storm'   }         NaN days 
    2003-02-07 21:15    {'SouthEast'}     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'   }      9.4576 days 
    2004-04-06 05:44    {'West'     }    434.81    3.4037e+05    2004-04-06 06:10    {'equipment fault'}    0.018056 days 
    2002-03-16 06:18    {'MidWest'  }    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'   }      2.7118 days 

停電期間のみをもつ timetable を作成します。TT の一部の行には復旧時刻に対して欠損値 NaT があり、OutageDurationNaN 値を招いています。medianTT から NaN 値を削除するには、関数 rmmissing を使用します。次に、retime を使用して停電期間の月次中間値を計算します。medianTT の最初の 5 行を表示します。

medianTT = TT(:,"OutageDuration");
medianTT = rmmissing(medianTT); 
medianTT = retime(medianTT,'monthly',@median);
head(medianTT,5)
       OutageTime       OutageDuration
    ________________    ______________

    2002-02-01 00:00      6.1889 days 
    2002-03-01 00:00      2.7472 days 
    2002-04-01 00:00         NaN days 
    2002-05-01 00:00     0.72917 days 
    2002-06-01 00:00     0.22431 days 

停電期間の月次中間値の階段状グラフを作成します。

stairs(medianTT.OutageTime,medianTT.OutageDuration)
xlabel("Year")
ylabel("Median Duration (days)")

Figure contains an axes object. The axes object with xlabel Year, ylabel Median Duration (days) contains an object of type stair.

参考

| | | | | | | | | | |

関連するトピック