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       
    ____________________    _____________    ______    __________    ____________________    ___________________

    01-Feb-2002 12:18:00    {'SouthWest'}    458.98    1.8202e+06    07-Feb-2002 16:50:00    {'winter storm'   }
    23-Jan-2003 00:49:00    {'SouthEast'}    530.14    2.1204e+05                     NaT    {'winter storm'   }
    07-Feb-2003 21:15:00    {'SouthEast'}     289.4    1.4294e+05    17-Feb-2003 08:14:00    {'winter storm'   }
    06-Apr-2004 05:44:00    {'West'     }    434.81    3.4037e+05    06-Apr-2004 06:10:00    {'equipment fault'}
    16-Mar-2002 06:18:00    {'MidWest'  }    186.44    2.1275e+05    18-Mar-2002 23:23:00    {'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)

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

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      
    ____________________    _____________    ______    _________    ____________________    _________________

    26-Jun-2008 22:36:00    {'NorthEast'}    425.21      93612      27-Jun-2008 06:53:00    {'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       
    ____________________    _____________    ______    _________    ____________________    ___________________

    01-Sep-2008 23:35:00    {'SouthEast'}    206.27     2.27e+05                     NaT    {'equipment fault'}
    01-Sep-2008 00:18:00    {'MidWest'  }    510.05        74213    01-Sep-2008 14:07:00    {'thunder storm'  }
    02-Sep-2008 19:01:00    {'MidWest'  }       NaN    2.215e+05    03-Sep-2008 02:58:00    {'severe storm'   }
    29-Aug-2008 20:25:00    {'West'     }       NaN        31624    01-Sep-2008 01:51:00    {'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      
    ____________________    _____________    ______    __________    ____________________    ________________

    01-Feb-2002 12:18:00    {'SouthWest'}    458.98    1.8202e+06    07-Feb-2002 16:50:00    {'winter storm'}
    23-Jan-2003 00:49:00    {'SouthEast'}    530.14    2.1204e+05                     NaT    {'winter storm'}
    07-Feb-2003 21:15:00    {'SouthEast'}     289.4    1.4294e+05    17-Feb-2003 08:14:00    {'winter storm'}
    16-Mar-2002 06:18:00    {'MidWest'  }    186.44    2.1275e+05    18-Mar-2002 23:23:00    {'severe storm'}
    04-Feb-2005 08:18:00    {'MidWest'  }       NaN           NaN    04-Feb-2005 19:51:00    {'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)
    OutageTime     Loss     Customers 
    ___________    _____    __________

    01-Jan-2002    81335    1.3052e+07
    01-Jan-2003    58036     1.396e+07
    01-Jan-2004    51014    1.5523e+07
    01-Jan-2005    33980    8.7334e+06
    01-Jan-2006    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
    ____________________    _____________    ______    __________    ____________________    ___________________    ______________

    01-Feb-2002 12:18:00    {'SouthWest'}    458.98    1.8202e+06    07-Feb-2002 16:50:00    {'winter storm'   }      6.1889 days 
    23-Jan-2003 00:49:00    {'SouthEast'}    530.14    2.1204e+05                     NaT    {'winter storm'   }         NaN days 
    07-Feb-2003 21:15:00    {'SouthEast'}     289.4    1.4294e+05    17-Feb-2003 08:14:00    {'winter storm'   }      9.4576 days 
    06-Apr-2004 05:44:00    {'West'     }    434.81    3.4037e+05    06-Apr-2004 06:10:00    {'equipment fault'}    0.018056 days 
    16-Mar-2002 06:18:00    {'MidWest'  }    186.44    2.1275e+05    18-Mar-2002 23:23:00    {'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
    ___________    ______________

    01-Feb-2002      6.1889 days 
    01-Mar-2002      2.7472 days 
    01-Apr-2002         NaN days 
    01-May-2002     0.72917 days 
    01-Jun-2002     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.

参考

| | | | | | | | | | |

関連するトピック