時系列オブジェクトとコレクション
時系列の種類と用途
MATLAB® 時系列オブジェクトには、次の 2 種類があります。
timeseries
— データ値および時間値と共に、単位、イベント、データ品質、内挿法などのメタデータ情報を保存します。tscollection
— 共通の時間ベクトルを共有するtimeseries
オブジェクトのコレクションを保存します。異なる単位をもつ同期した時系列を操作するのに便利です。
この節では、次のことについて説明します。
時系列クラスのインスタンスを作成する時系列コンストラクターの利用
set
メソッドまたはドット表記を用いて、オブジェクトのプロパティを変更時系列関数とメソッドの呼び出し
timeseries
オブジェクトと tscollection
オブジェクトを使用したプログラミングを確認するには、例: 時系列オブジェクトとメソッドの手順に従います。
時系列データ サンプル
このドキュメンテーションにある timeseries
オブジェクトのプロパティとメソッドの説明を正しく理解するには、"データ値" と "データ サンプル" の違いなど、timeseries
オブジェクトへのデータの格納に関連する用語の意味を知っておくことが重要です。
"データ値" は、特定の時間に記録される 1 つのスカラー値です。"データ サンプル" は、timeseries
オブジェクトの特定の時間に関連する 1 つまたは複数の値から成ります。時系列のデータ サンプルの数は、時間ベクトルの長さと同じです。
たとえば、3 つのセンサー信号で構成されるデータを考えます。2 つの信号は、オブジェクトの位置をメートル単位で表します。3 つ目の信号は、その速度をメートル/秒 単位で表します。
データ行列を入力するために、MATLAB プロンプトで以下を入力します。
x = [-0.2 -0.3 13; -0.1 -0.4 15; NaN 2.8 17; 0.5 0.3 NaN; -0.3 -0.1 15]
NaN
値は、欠損値を表します。MATLAB には、次の 5 行 3 列の行列が表示されます。
x= -0.2000 -0.3000 13.0000 -0.1000 -0.4000 15.0000 NaN 2.8000 17.0000 0.5000 0.3000 NaN -0.3000 -0.1000 15.0000
x
の最初の 2 列は同じ単位をもつ量を含むので、これら 2 つの時系列を保存するための多変量の timeseries
オブジェクトを作成できます。timeseries
オブジェクトの作成の詳細は、時系列コンストラクターを参照してください。次のコマンドは、位置の値を保存する timeseries
オブジェクト、ts_pos
を作成します。
ts_pos = timeseries(x(:,1:2), 1:5, 'name', 'Position')
MATLAB は、ts_pos
の次のプロパティを表示します。
timeseries Common Properties: Name: 'Position' Time: [5x1 double] TimeInfo: [1x1 tsdata.timemetadata] Data: [5x2 double] DataInfo: [1x1 tsdata.datametadata] More properties, Methods
時間ベクトルの Length
(この例では 5
) は、timeseries
オブジェクトのデータ サンプル数に等しくなります。MATLAB プロンプトに次のように入力して、ts_pos
のデータ サンプルのサイズを求めます。
getdatasamplesize(ts_pos) ans = 1 2
同様に、2 つ目の timeseries
オブジェクトを作成して、速度のデータを保存します。
ts_vel = timeseries(x(:,3), 1:5, 'name', 'Velocity');
次のように入力して、ts_vel
の各データ サンプルのサイズを求めます。
getdatasamplesize(ts_vel) ans = 1 1
ts_vel
は、各データ サンプルの 1 つのデータ値をもち、ts_pos
は、各データ サンプルの 2 つのデータ値をもつことに注意してください。
メモ
一般に、時系列データが M 個のサンプルをもつ M x N x P x ... の多次元配列の場合は、各データサンプルのサイズは N x P x ... になります。 .
timeseries
オブジェクトの ts_pos
と ts_vel
を同期した状態で操作できるようにするには、これらのオブジェクトを時系列コレクションにまとめます。詳細は、時系列コレクション コンストラクターの構文を参照してください。
例: 時系列オブジェクトとメソッド
時系列オブジェクトの作成
ここでは、配列からいくつかの timeseries
オブジェクトを作成する方法を説明します。timeseries
オブジェクトの詳細は、時系列コンストラクターを参照してください。
サンプル データを、count.dat
から MATLAB ワークスペースにインポートします。
load count.dat
これにより、24 行 3 列の行列 count
がワークスペースに追加されます。count
の各列は、3 つの交差点それぞれにおける 1 時間ごとの車両数を表します。
行列 count
を表示します。
count
3 つの timeseries
オブジェクトを作成して、それぞれの交差点で収集されたデータを格納します。
count1 = timeseries(count(:,1), 1:24,'name', 'intersection1'); count2 = timeseries(count(:,2), 1:24,'name', 'intersection2'); count3 = timeseries(count(:,3), 1:24,'name', 'intersection3');
メモ
上記の構造で timeseries
オブジェクトは、変数名 (count1
) と内部でのオブジェクト名 (intersection1
) の両方をもっています。変数名は、MATLAB 関数で使用されます。オブジェクト名は、オブジェクトのメソッドでアクセスされるオブジェクトのプロパティです。timeseries
オブジェクトのプロパティとメソッドの詳細については、時系列のプロパティおよび時系列のメソッドを参照してください。
既定値では、時系列には、秒単位の時間ベクトルと開始時刻 0 秒が格納されています。この例では、count1
、count2
、および count3
の時系列オブジェクトと、開始時刻 1 秒、終了時刻 24 秒、および増分 1 秒で構成されています。増分の単位を hours に変更するには、時系列の単位と内挿法の変更を参照してください。
メモ
count
の 3 つのデータ列をまとめた timeseries
オブジェクトを作成する場合は、次の構文を使用します。
count_ts = timeseries(count, 1:24,'name','traffic_counts')
これは、すべての時系列が同じ単位をもっている場合に、計算中に時系列の同期を取るのに便利です。
時系列の単位と内挿法の変更
時系列オブジェクトの作成の説明に従って timeseries
オブジェクトを作成したら、ドット表記を使ってその単位と内挿法を変更できます。
count1
の現在のプロパティを表示します。
get(count1)
MATLAB によって、count1
timeseries
オブジェクトの現在のプロパティ値が表示されます。
ドット表記を使用して、現在の DataInfo
プロパティを表示します。
count1.DataInfo
count1
のデータ単位を 'cars'
に変更します。
count1.DataInfo.Units = 'cars';
count1
の内挿法をゼロ次ホールドに設定します。
count1.DataInfo.Interpolation = tsdata.interpolation('zoh');
DataInfo
プロパティが変更されたことを確認します。
count1.DataInfo
3 つの時系列の時間単位を 'hours'
に変更します。
count1.TimeInfo.Units = 'hours'; count2.TimeInfo.Units = 'hours'; count3.TimeInfo.Units = 'hours';
イベントの定義
ここでは、tsdata.event
補助オブジェクトを使用して、timeseries
オブジェクトのイベントを定義する方法を説明します。イベントは、特定の時間のデータをマークします。データをプロットすると、イベント マーカーがプロットに表示されます。また、イベントは、複数の時系列を同期するのにも便利です。
午前と午後の通勤時間をマークする 2 つのイベントをデータに追加します。
最初のイベントを作成し、すべての時系列に追加します。最初のイベントは午前 8 時に発生します。
e1 = tsdata.event('AMCommute',8); e1.Units = 'hours'; % Specify the units for time count1 = addevent(count1,e1); % Add the event to count1 count2 = addevent(count2,e1); % Add the event to count2 count3 = addevent(count3,e1); % Add the event to count3
2 番目のイベントを作成し、すべての時系列に追加します。2 番目のイベントは午後 6 時に発生します。
e2 = tsdata.event('PMCommute',18); e2.Units = 'hours'; % Specify the units for time count1 = addevent(count1,e2); % Add the event to count1 count2 = addevent(count2,e2); % Add the event to count2 count3 = addevent(count3,e2); % Add the event to count3
時系列 count1
をプロットします。
figure plot(count1)
任意の時系列をプロットすると、時系列オブジェクトに定義された plot メソッドによって、イベントがマーカーとして表示されます。既定の設定では、マーカーは塗りつぶされた赤い円です。
count1
がゼロ次ホールド内挿を使用していることがプロットに反映されます。
count2
をプロットします。
plot(count2)
時系列 count2
をプロットすると、count1
の表示と置き換わります。そのイベントが表示され、線形内挿が使用されていることがわかります。
hold on
を設定することで、複数の時系列プロットを重ねて表示します。
hold on
plot(count3)
時系列集合オブジェクトの作成
ここでは、tscollection
オブジェクトを作成する方法を説明します。コレクションにある各時系列のことを、"メンバー" といいます。tscollection
オブジェクトの詳細は、時系列コレクション コンストラクターを参照してください。
メモ
通常、tscollection
オブジェクトは、異なる単位をもつ同期された時系列をまとめるために使用します。上の簡単な例では、すべての時系列が同じ単位なので、tscollection
オブジェクトを作成しても、3 つの時系列を 1 つの timeseries
オブジェクトにまとめる場合と比べて利点はありません。複数の時系列を 1 つの timeseries
オブジェクトにまとめる方法の例については、時系列オブジェクトの作成を参照してください。
tscollection
という count_coll
オブジェクトを作成し、コンストラクターの構文を使用して、現在 MATLAB ワークスペースにある 3 つの時系列のうち 2 つをすぐに追加します (3 つ目の時系列は後で追加します)。
tsc = tscollection({count1 count2},'name', 'count_coll')
メモ
tscollection
に追加する timeseries
オブジェクトの時間ベクトルはすべて同じでなければなりません。
timeseries
オブジェクトの Name
プロパティが、コレクションのメンバー名 (intersection1
と intersection2
) として使用されていることに注意してください。
ワークスペースの 3 番目の timeseries
オブジェクトを tscollection
に追加します。
tsc = addts(tsc, count3)
コレクション内の 3 つのメンバーすべてがリストされます。
時系列集合オブジェクトのリサンプリング
ここでは、新しい時間ベクトルを使用して tscollection
の各メンバーをリサンプルする方法を説明します。リサンプリングは、特定の時間の既存のデータを選択するか、より細かい区間でデータを内挿するために行います。新しい時間ベクトルが前の時間ベクトルに存在しなかった時間値を含む場合は、新しいデータ値は時系列に関連付けられている既定の内挿法を用いて計算されます。
データ値を 1 時間ごとではなく 2 時間ごとに収集するように時系列をリサンプリングし、新しい tscollection
オブジェクトとして保存します。
tsc1 = resample(tsc,1:2:24)
現在よりも情報を細かくサンプリングしなければならないこともあります。このような場合は、データ値を内挿して取得すれば合理的です。
30 分おきに値を内挿します。
tsc1 = resample(tsc,1:0.5:24)
30 分おきに値を追加するために、時系列の既定の内挿法を使用します。たとえば、intersection1
の新しいデータ点は、前のサンプルの値を定数にする、ゼロ次ホールド内挿法を用いて計算されます。時系列の単位と内挿法の変更の説明に従って、intersection1
の内挿法を設定します。
intersection2
と intersection3
の新しいデータ点は、既定の線形内挿法で計算されます。
tsc1
のメンバーをマーカーを使用してプロットし、内挿結果を確認します。
hold off % Allow axes to clear before plotting plot(tsc1.intersection1,'-xb','Displayname','Intersection 1')
データ点が 30 分間隔で内挿され、Intersection 1 にはゼロ次ホールド内挿が使用されている一方で、他の 2 つのメンバーには線形内挿が使用されていることがわかります。
Figure 内のグラフを保持したまま、他の 2 つのメンバーをプロットに追加します。hold
が on
になっている間は plot
メソッドによって軸ラベルが非表示になるため、3 つの時系列を説明する凡例も追加します。
hold on plot(tsc1.intersection2,'-.xm','Displayname','Intersection 2') plot(tsc1.intersection3,':xr','Displayname','Intersection 3') legend('show','Location','NorthWest')
時系列集合オブジェクトへのデータ サンプルの追加
ここでは、tscollection
にデータ サンプルを追加する方法を説明します。
intersection1
コレクションのメンバーに 3.25 時間 (3 時間 15 分) の時点でデータ サンプルを追加します。
tsc1 = addsampletocollection(tsc1,'time',3.25,... 'intersection1',5);
tsc1
コレクションには 3 つのメンバーがあり、1 つのメンバーにデータ サンプルを追加すると、他の 2 つのメンバーにも 3.25 時間の時点にデータ サンプルが追加されます。ただし、新しいサンプルでは intersection2
と intersection3
のデータ値を指定しなかったので、欠損値が NaN
で示されます。欠損値を削除または内挿する方法については、欠損データの削除と欠損データの内挿を参照してください。
tsc1
の 2.0 ~ 3.5 時間のデータ
時間 (Hours) | Intersection1 | Intersection2 | Intersection3 |
---|---|---|---|
2.0 | 7 | 13 | 11 |
2.5 | 7 | 15 | 15.5 |
3.0 | 14 | 17 | 20 |
3.25 | 5 |
|
|
3.5 | 14 | 15 | 14.5 |
すべての intersection1
のデータ (3.25 時間での新しいサンプルを含む) を表示するには、次のように入力します。
tsc1.intersection1
同様に、すべての intersection2
のデータ (新しい 3.25 時間 での NaN
値を含む) を表示するには、次のように入力します。
tsc1.intersection2
欠損データの削除と内挿
時系列オブジェクトでは、欠損データを表すのに NaN
を使用します。この例では、欠損データを削除する方法、および時系列用に指定した内挿法を使用する方法を説明します。時系列集合オブジェクトへのデータ サンプルの追加 では、tsc1
コレクションに 3.25 時間の新しいデータ サンプルを追加しました。
tsc1
コレクションには 3 つのメンバーがあり、1 つのメンバーにデータ サンプルを追加すると、他の 2 つのメンバーにも 3.25 時間のデータ サンプルが追加されます。ただし、intersection2
と intersection3
に 3.25 時間 のデータ値が指定されていないため、ここでは NaN
によって表される欠損値が含まれています。
欠損データの削除. tsc1
コレクション内で NaN 値を含むデータ サンプルを見つけて削除します。
tsc1 = delsamplefromcollection(tsc1,'index',... find(isnan(tsc1.intersection2.Data)));
このコマンドは、一度に 1 つの tscollection
メンバー (この場合は intersection2
) を探します。欠損値が intersection2
にある場合は、その時間のデータは tscollection
の "すべての" メンバーから削除されます。
メモ
tsc1
コレクションの intersection2
メンバーの Data
プロパティにアクセスするには、ドット表記法の構文を使用します。
tsc1.intersection2.Data
timeseries
プロパティの一覧については、時系列のプロパティを参照してください。
欠損データの内挿. この例の目的のため、intersection2
と intersection3
に NaN
値を再度導入します。
tsc1 = addsampletocollection(tsc1,'time',3.25,... 'intersection1',5);
現在の時間ベクトル (tsc1.Time
) を使用して、tsc1
の欠損値を内挿します。
tsc1 = resample(tsc1,tsc1.Time);
線形内挿 (これらの時系列の既定の内挿法) を使用して、intersection2
と intersection3
の NaN
値が置き換えられます。
メモ
tsc1.Time
というドット表記を使って、tsc1
コレクションの Time
プロパティにアクセスします。tscollection
プロパティの一覧については、時系列コレクションのプロパティを参照してください。
内挿後に intersection2
のデータを表示するには、次のように入力します。
tsc1.intersection2
tsc1 の 2.0 ~ 3.5 時間の新しいデータ
時間 (Hours) | Intersection1 | Intersection2 | Intersection3 |
---|---|---|---|
2.0 | 7 | 13 | 11 |
2.5 | 7 | 15 | 15.5 |
3.0 | 14 | 17 | 20 |
3.25 | 5 | 16 | 17.3 |
3.5 | 14 | 15 | 14.5 |
時系列コレクションからの時系列の削除
tscollection
オブジェクト tsc1
から時系列 intersection3
を削除します。
tsc1 = removets(tsc1,'intersection3')
これで、コレクションのメンバーとして時系列が 2 つだけリストされます。
時間ベクトル値を日付文字列として表示
ここでは、MATLAB の日付文字列を使用して、数値の時間ベクトルの表示形式を制御する方法を説明します。timeseries
オブジェクトと tscollection
オブジェクトで使用できる MATLAB の日付文字列の形式の一覧については、timeseries
のリファレンス ページにある時間ベクトルの定義を参照してください。
日付文字列を使用するには、TimeInfo
プロパティの StartDate
フィールドを設定しなければなりません。時間ベクトルのすべての値が、StartDate
を基準日にして日付文字列に変換されます。
基準日が 2009 年 12 月 25 日であるとします。
tsc1.TimeInfo.Units = 'hours'; tsc1.TimeInfo.StartDate = '25-DEC-2009 00:00:00';
count1
、count2
、および count3
の各時系列オブジェクトと同様に、tsc1
メンバーのデータ単位を文字列 'car count'
に設定します。
tsc1.intersection1.DataInfo.Units = 'car count'; tsc1.intersection2.DataInfo.Units = 'car count';
時系列コレクションのメンバーのプロット
時系列コレクションのデータをプロットするには、そのメンバーを一度に 1 つずつプロットします。
最初は、グラフ tsc1
のメンバー intersection1
です。
hold off
plot(tsc1.intersection1);
時系列コレクションのメンバーをプロットすると、時間単位が x
軸に、データ単位が y
軸に表示されます。プロットのタイトルは 'Time Series Plot:<member name>'
と表示されます。
同じ Figure を使用してコレクションの別のメンバーをプロットする場合、注釈は表示されません。時系列の plot
メソッドでは、hold
が on
のときはラベルとタイトルが更新されません。時系列の記述子が異なっていても構わないためです。
intersection1
と intersection2
を同じ Figure にプロットします。プロットは上書きされませんが、軸ラベルとタイトルは削除されます。凡例を追加し、ラインの DisplayName
プロパティを設定して各メンバーにラベルを付けます。
plot(tsc1.intersection1,'-xb','Displayname','Intersection 1') hold on plot(tsc1.intersection2,'-.xm','Displayname','Intersection 2') legend('show','Location','NorthWest')
これで、このプロットではコレクションに intersection1
と intesection2
の 2 つの時系列が含まれるようになりました。2 番目のグラフをプロットすると、最初のグラフのラベルは消去されます。
最後に、x
軸上の日付文字列を hours
に変更し、コレクションの 2 つの時系列メンバーを凡例付きで再度プロットします。
コレクションの時間単位を 'hours' に指定します。
tsc1.TimeInfo.Units = 'hours';
時間を表示する形式を指定します。
tsc1.TimeInfo.Format = 'HH:MM';
新しい時間単位で、最後のプロットを再作成します。
hold off plot(tsc1.intersection1,'-xb','Displayname','Intersection 1') % Prevent overwriting plot, but remove axis labels and title. hold on plot(tsc1.intersection2,'-.xm','Displayname','Intersection 2') legend('show','Location','NorthWest') % Restore the labels with the |xlabel| and |ylabel| commands and overlay a % data grid. xlabel('Time (hours)') ylabel('car count') grid on
時系列のプロット オプションの詳細については、timeseries
を参照してください。
時系列コンストラクター
時系列データを取り扱うために特別に設定された、さまざまな MATLAB 関数とメソッドを実装する前に、データを保存する timeseries
オブジェクトを作成しなければなりません。timeseries
オブジェクト コンストラクターの構文については、timeseries
を参照してください。
コンストラクターの使用例については、時系列オブジェクトの作成を参照してください。
時系列のプロパティ
すべての timeseries
オブジェクト プロパティの説明については、timeseries
を参照してください。Data
、IsTimeFirst
、Name
、Quality
、Time
プロパティをコンストラクターの入力引数として指定できます。他のプロパティを割り当てるには、関数 set
またはドット表記を使用します。
メモ
コマンド ラインを使用してプロパティの情報を取得するには、MATLAB プロンプトで「help timeseries/tsprops
」と入力します。
timeseries
オブジェクトのプロパティを編集する例については、時系列の単位と内挿法の変更を参照してください。
時系列のメソッド
すべての時系列メソッドの説明については、timeseries
を参照してください。
時系列コレクション コンストラクター
はじめに
tscollection
と呼ばれる MATLAB オブジェクトは、共通の時間ベクトルをもついくつかの時系列をグループ化する MATLAB 変数です。tscollection
オブジェクトに含める timeseries
オブジェクトは、このコレクションの "メンバー" と呼ばれ、timeseries
の解析と操作に便利ないくつかのメソッドをもちます。
時系列コレクション コンストラクターの構文
timeseries
オブジェクトのコレクションを操作するように特別に設定された MATLAB の手法を実装する前に、データを保存する tscollection
オブジェクトを作成しなければなりません。
次の表に、tscollection
コンストラクターを使用する場合の構文をまとめます。このコンストラクターの使用例については、時系列集合オブジェクトの作成を参照してください。
時系列コレクションの構文の説明
構文 | 説明 |
---|---|
| 1 つまたは複数の
複数の |
| 時間ベクトル 時間値が日付文字列の場合は、 |
|
|
時系列コレクションのプロパティ
次の表に、tscollection
オブジェクトのプロパティを示します。Name
、Time
、TimeInfo
プロパティを tscollection
コンストラクターの入力引数として指定できます。
時系列コレクションのプロパティの説明
プロパティ | 説明 |
---|---|
| 文字列として入力する |
| 時間値のベクトル。
|
|
|
時系列コレクションのメソッド
時系列コレクションの一般的なメソッド. 次のメソッドを使用して、オブジェクト プロパティのクエリと設定を行い、データをプロットします。
プロパティをクエリするメソッド
日付と時間を取り扱うメソッド. 次のメソッドを使用して、データ サンプルの追加または削除を行ったり、tscollection
オブジェクトを取り扱います。
日付と時間を取り扱うメソッド
メソッド | 説明 |
---|---|
| |
| |
| |
| |
既存の | |
| |
| |
| |
新しい時間ベクトルを用いて、 | |
| |
| |
|