timetable での時間の選択
timetable は table の一種で、各行に時刻が関連付けられています。データの時間ベースのサブセットは次の複数の方法で選択できます。
関数
timerangeまたは関数withtolを使用して特定の範囲内で時間を検索する。配列
datetimeのコンポーネントを使用して、日や月などの繰り返し発生する時間単位を一致させる。関数
retimeを使用してデータをリサンプリングまたはグループ化する。
たとえば、米国における 2002 ~ 2014 年の電力会社の停電を表すデータが含まれるサンプル ファイル outages.csv を読み取ります。行時間のベクトル OutageTime は、停電が発生した時期を示しています。関数 readtimetable はそれを配列 datetime としてインポートします。テキストを string 配列としてインポートするには、名前と値の引数 TextType を "string" として指定します。
TT = readtimetable("outages.csv",TextType="string")
TT=1468×5 timetable
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"
2003-06-18 02:49 "West" 0 0 2003-06-18 10:54 "attack"
2004-06-20 14:39 "West" 231.29 NaN 2004-06-20 19:16 "equipment fault"
2002-06-06 19:28 "West" 311.86 NaN 2002-06-07 00:51 "equipment fault"
2003-07-16 16:23 "NorthEast" 239.93 49434 2003-07-17 01:12 "fire"
2004-09-27 11:09 "MidWest" 286.72 66104 2004-09-27 16:37 "equipment fault"
2004-09-05 17:48 "SouthEast" 73.387 36073 2004-09-05 20:46 "equipment fault"
2004-05-21 21:45 "West" 159.99 NaN 2004-05-22 04:23 "equipment fault"
2002-09-01 18:22 "SouthEast" 95.917 36759 2002-09-01 19:12 "severe storm"
2003-09-27 07:32 "SouthEast" NaN 3.5517e+05 2003-10-04 07:02 "severe storm"
2003-11-12 06:12 "West" 254.09 9.2429e+05 2003-11-17 02:04 "winter storm"
2004-09-18 05:54 "NorthEast" 0 0 NaT "equipment fault"
⋮
時間範囲の選択
特定の範囲内でデータを検索する場合、関数 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 See Select Times in Timetable.
この範囲で発生した停電を見つけて、影響を受けた顧客の数を経時的にプロットします。
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,:)
winterTT=316×5 timetable
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"
2005-03-08 16:37 "SouthEast" 1339.2 4.3003e+05 2005-03-10 20:42 "winter storm"
2002-03-26 01:59 "MidWest" 388.04 5.6422e+05 2002-03-28 19:55 "winter storm"
2003-03-27 08:03 "NorthEast" 204.79 1.479e+05 2003-03-28 05:54 "severe storm"
2003-02-24 06:13 "SouthEast" 0 0 2003-02-24 21:18 "attack"
2002-03-05 17:53 "MidWest" 96.563 2.8666e+05 2002-03-10 14:41 "wind"
2006-01-21 21:27 "SouthEast" 19.513 10994 2006-01-21 23:25 "equipment fault"
2004-01-19 12:37 "MidWest" 16.03 2.2296 2004-01-20 02:50 "equipment fault"
2005-03-01 14:39 "West" 115.47 82611 2005-03-03 05:58 "equipment fault"
2003-01-10 15:38 "West" 185.85 2.757e+05 2003-01-12 05:48 "winter storm"
2004-01-14 20:01 "NorthEast" 87.08 14979 2004-01-16 00:52 "energy emergency"
2004-01-04 10:45 "NorthEast" 145.86 27942 2004-01-08 19:34 "energy emergency"
⋮
冬季の原因の円グラフを作成します。関数 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")
numTT=13×2 timetable
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
2007-01-01 00:00 29112 1.2494e+07
2008-01-01 00:00 34608 1.7608e+07
2009-01-01 00:00 15487 1.1785e+07
2010-01-01 00:00 51543 2.7614e+07
2011-01-01 00:00 34834 1.3614e+07
2012-01-01 00:00 42548 1.8905e+07
2013-01-01 00:00 19572 1.1284e+07
2014-01-01 00:00 0 0
各年に影響を受けた顧客の数の棒グラフを作成します。
bar(numTT.OutageTime,numTT.Customers) xlabel("Year") ylabel("Customers")

行時間を使用した継続期間の計算
timetable の行時間をその他の datetime 値または duration 値とともに使用して計算を実行できます。たとえば、停電データにリストされた停電の継続期間を計算します。次に、停電期間の月次中央値を計算してプロットします。
最初に、RestorationTime (停電の終了) から行時間 (停電の開始) を減算して停電期間を TT に追加します。OutageDuration の形式を変更して、停電の継続期間を日数で表示します。
TT.OutageDuration = TT.RestorationTime - TT.OutageTime;
TT.OutageDuration.Format = "d"TT=1468×6 timetable
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
2003-06-18 02:49 "West" 0 0 2003-06-18 10:54 "attack" 0.33681 days
2004-06-20 14:39 "West" 231.29 NaN 2004-06-20 19:16 "equipment fault" 0.19236 days
2002-06-06 19:28 "West" 311.86 NaN 2002-06-07 00:51 "equipment fault" 0.22431 days
2003-07-16 16:23 "NorthEast" 239.93 49434 2003-07-17 01:12 "fire" 0.36736 days
2004-09-27 11:09 "MidWest" 286.72 66104 2004-09-27 16:37 "equipment fault" 0.22778 days
2004-09-05 17:48 "SouthEast" 73.387 36073 2004-09-05 20:46 "equipment fault" 0.12361 days
2004-05-21 21:45 "West" 159.99 NaN 2004-05-22 04:23 "equipment fault" 0.27639 days
2002-09-01 18:22 "SouthEast" 95.917 36759 2002-09-01 19:12 "severe storm" 0.034722 days
2003-09-27 07:32 "SouthEast" NaN 3.5517e+05 2003-10-04 07:02 "severe storm" 6.9792 days
2003-11-12 06:12 "West" 254.09 9.2429e+05 2003-11-17 02:04 "winter storm" 4.8278 days
2004-09-18 05:54 "NorthEast" 0 0 NaT "equipment fault" NaN days
⋮
停電期間のみをもつ timetable を作成します。TT の一部の行には復旧時刻に対して欠損値 NaT があり、OutageDuration の NaN 値を招いています。medianTT から NaN 値を削除するには、関数 rmmissing を使用します。次に、retime を使用して停電期間の月次中間値を計算します。
medianTT = TT(:,"OutageDuration"); medianTT = rmmissing(medianTT); medianTT = retime(medianTT,"monthly",@median)
medianTT=143×1 timetable
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
2002-07-01 00:00 0.64653 days
2002-08-01 00:00 0.49514 days
2002-09-01 00:00 0.10139 days
2002-10-01 00:00 2.3451 days
2002-11-01 00:00 0.12222 days
2002-12-01 00:00 2.0243 days
2003-01-01 00:00 1.5903 days
2003-02-01 00:00 3.2955 days
2003-03-01 00:00 0.47326 days
2003-04-01 00:00 0.95347 days
2003-05-01 00:00 2.2882 days
⋮
停電期間の月次中間値の階段状グラフを作成します。
stairs(medianTT.OutageTime,medianTT.OutageDuration) xlabel("Year") ylabel("Median Duration (days)")

参考
categorical | timetable | retime | timerange | readtimetable | month | withtol | rmmissing | vartype | datetime | duration | NaT