Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

timetable での時間の選択

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

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

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

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

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

TT = readtimetable('outages.csv');
head(TT,5)
ans=5×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'   }

"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:
		[20-Jun-2008 00:00:00, 22-Sep-2008 00:00:00)

	See Select Timetable Data by Row Time and Variable Type.

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

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

Figure contains an axes. The axes 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. The axes 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)
ans=5×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'      }

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

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)
ans=5×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

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

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

Figure contains an axes. The axes 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)
ans=5×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 

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

medianTT = TT(:,"OutageDuration");
medianTT = rmmissing(medianTT); 
medianTT = retime(medianTT,'monthly',@median);
head(medianTT,5)
ans=5×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 

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

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

Figure contains an axes. The axes contains an object of type stair.

参考

| | | | | | | | | | |

関連するトピック