timetable での時間の選択
R2026btimetable は table の一種で、各行に時刻が関連付けられています。データの時間ベースのサブセットは次の複数の方法で選択できます。
関数
timerangeまたは関数withtolを使用して特定の範囲内で時間を検索する。timerange関数を使用して、日や月などの繰り返し発生する時間単位を一致させる。関数
retimeを使用してデータをリサンプリングまたはグループ化する。行時間を使用して特定の行を選択する。行時間が数値の場合、
labels関数を使用して行インデックスと区別します。
たとえば、米国における 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)")

数値の行時間による timetable の添字
各停電が発生した時刻を数値の行時間で表す timetable を作成します。
HourOfDay = hour(TT.OutageTime); TT2 = timetable(TT.OutageDuration,TT.Loss,RowTimes=HourOfDay,VariableNames=["OutageDuration","Loss"]); TT2.Properties.DimensionNames(1) = "HourOfDay"
TT2 = 1468×2 timetable
HourOfDay OutageDuration Loss
_________ ______________ ______
12 6.1889 days 458.98
0 NaN days 530.14
21 9.4576 days 289.4
5 0.018056 days 434.81
6 2.7118 days 186.44
2 0.33681 days 0
14 0.19236 days 231.29
19 0.22431 days 311.86
16 0.36736 days 239.93
11 0.22778 days 286.72
17 0.12361 days 73.387
21 0.27639 days 159.99
18 0.034722 days 95.917
7 6.9792 days NaN
6 4.8278 days 254.09
5 NaN days 0
⋮
labels を使用して、行時間が 12 に等しいすべての行を選択します。
TT2(labels(12),:)
ans = 53×2 timetable
HourOfDay OutageDuration Loss
_________ ______________ ______
12 6.1889 days 458.98
12 1.3708 days 2966.1
12 11.724 days 8767.3
12 0.59236 days 16.03
12 7.2924 days 736.37
12 0.29097 days 517.13
12 0.12014 days 79.678
12 1.2847 days 61.711
12 0.069444 days 169.73
12 11.58 days 121.45
12 0.11944 days 208.77
12 4.2799 days 328.13
12 0.39514 days 194.71
12 0.49167 days NaN
12 13.561 days NaN
12 0.00625 days 818.17
⋮
これは、12 行目を選択する
TT2(12,:)
ans = 1×2 timetable
HourOfDay OutageDuration Loss
_________ ______________ ______
21 0.27639 days 159.99
の呼び出しとは異なります。
参考
categorical | timetable | retime | timerange | labels | readtimetable | month | withtol | rmmissing | vartype | datetime | duration | NaT