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")
その時間範囲中に発生した複数の停電は、顧客に大きく影響しています。範囲を 2008 年全体にわたる期間に拡張し、同様に高い数値を探します。
TR = timerange("2008","years"); all08 = TT(TR,:); high08 = all08(all08.Customers > 500000,:); stem(high08.OutageTime,high08.Customers) ylabel('Customers')
関数 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
入力しか受け入れないため、最初に Cause
を categorical
に変換します。
winterTT.Cause = categorical(winterTT.Cause);
pie(winterTT.Cause)
title("Causes of Outages, January to March");
期間でのグループ化
関数 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")
行時間を使用した継続期間の計算
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
があり、OutageDuration
の NaN
値を招いています。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)")
参考
categorical
| timetable
| retime
| timerange
| readtimetable
| month
| withtol
| rmmissing
| vartype
| datetime
| duration
| NaT