Main Content

時系列オブジェクトとコレクション

時系列の種類と用途

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_posts_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 秒が格納されています。この例では、count1count2、および 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 プロパティが、コレクションのメンバー名 (intersection1intersection2) として使用されていることに注意してください。

ワークスペースの 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 の内挿法を設定します。

intersection2intersection3 の新しいデータ点は、既定の線形内挿法で計算されます。

tsc1 のメンバーをマーカーを使用してプロットし、内挿結果を確認します。

hold off                % Allow axes to clear before plotting
plot(tsc1.intersection1,'-xb','Displayname','Intersection 1')

データ点が 30 分間隔で内挿され、Intersection 1 にはゼロ次ホールド内挿が使用されている一方で、他の 2 つのメンバーには線形内挿が使用されていることがわかります。

Figure 内のグラフを保持したまま、他の 2 つのメンバーをプロットに追加します。holdon になっている間は 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 時間の時点にデータ サンプルが追加されます。ただし、新しいサンプルでは intersection2intersection3 のデータ値を指定しなかったので、欠損値が 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

NaN

NaN

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 時間のデータ サンプルが追加されます。ただし、intersection2intersection3 に 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 プロパティの一覧については、時系列のプロパティを参照してください。

欠損データの内挿.  この例の目的のため、intersection2intersection3NaN 値を再度導入します。

tsc1 = addsampletocollection(tsc1,'time',3.25,...
       'intersection1',5);

現在の時間ベクトル (tsc1.Time) を使用して、tsc1 の欠損値を内挿します。

tsc1 = resample(tsc1,tsc1.Time);

線形内挿 (これらの時系列の既定の内挿法) を使用して、intersection2intersection3NaN 値が置き換えられます。

メモ

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';

count1count2、および 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 メソッドでは、holdon のときはラベルとタイトルが更新されません。時系列の記述子が異なっていても構わないためです。

intersection1intersection2 を同じ Figure にプロットします。プロットは上書きされませんが、軸ラベルとタイトルは削除されます。凡例を追加し、ラインの DisplayName プロパティを設定して各メンバーにラベルを付けます。

plot(tsc1.intersection1,'-xb','Displayname','Intersection 1')
hold on
plot(tsc1.intersection2,'-.xm','Displayname','Intersection 2')
legend('show','Location','NorthWest')

これで、このプロットではコレクションに intersection1intesection2 の 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 を参照してください。DataIsTimeFirstNameQualityTime プロパティをコンストラクターの入力引数として指定できます。他のプロパティを割り当てるには、関数 set またはドット表記を使用します。

メモ

コマンド ラインを使用してプロパティの情報を取得するには、MATLAB プロンプトで「help timeseries/tsprops」と入力します。

timeseries オブジェクトのプロパティを編集する例については、時系列の単位と内挿法の変更を参照してください。

時系列のメソッド

すべての時系列メソッドの説明については、timeseries を参照してください。

時系列コレクション コンストラクター

はじめに

tscollection と呼ばれる MATLAB オブジェクトは、共通の時間ベクトルをもついくつかの時系列をグループ化する MATLAB 変数です。tscollection オブジェクトに含める timeseries オブジェクトは、このコレクションの "メンバー" と呼ばれ、timeseries の解析と操作に便利ないくつかのメソッドをもちます。

時系列コレクション コンストラクターの構文

timeseries オブジェクトのコレクションを操作するように特別に設定された MATLAB の手法を実装する前に、データを保存する tscollection オブジェクトを作成しなければなりません。

次の表に、tscollection コンストラクターを使用する場合の構文をまとめます。このコンストラクターの使用例については、時系列集合オブジェクトの作成を参照してください。

時系列コレクションの構文の説明

構文

説明

tsc = tscollection(ts)

1 つまたは複数の timeseries オブジェクトを含む tscollection オブジェクト、tsc を作成します。

ts の引数は、次のいずれかになります。

  • MATLAB ワークスペースの 1 つの timeseries オブジェクト

  • MATLAB ワークスペースの timeseries オブジェクトの cell 配列

複数の timeseries オブジェクトは、tscollection 内で同じ時間ベクトルを共有します。

tsc = tscollection(Time)

時間ベクトル Time をもつ空の tscollection オブジェクトを作成します。

時間値が日付文字列の場合は、Time を日付文字列の cell 配列として指定しなければなりません。

tsc = tscollection(Time, TimeSeries, 'Parameter', Value, ...)

Time 引数と TimeSeries 引数の後に、次のパラメーターと値の組を入力します (オプション)。

時系列コレクションのプロパティ

次の表に、tscollection オブジェクトのプロパティを示します。NameTimeTimeInfo プロパティを tscollection コンストラクターの入力引数として指定できます。

時系列コレクションのプロパティの説明

プロパティ

説明

Name

文字列として入力する tscollection オブジェクト名。この名前は、MATLAB ワークスペースの tscollection の変数名とは異なるものにできます。

Time

時間値のベクトル。

TimeInfo.StartDate が空の場合は、Time の数値は、指定された単位で 0 と比較して測定されます。TimeInfo.StartDate が定義される場合、時間値は指定した単位で StartDate と比較して測定される日付文字列を表します。

Time の長さは、各 tscollection メンバーの Data プロパティの最初または最後の次元と一致しなければなりません。

TimeInfo

Time についての状況の情報を保存するため、次のフィールドを使用します。

  • Units — 次の値をとる時間単位。'weeks''days''hours''minutes''seconds''milliseconds''microseconds''nanoseconds'

  • Start — 開始時間

  • End — 終了時間 (読み取り専用)

  • Increment — 2 つの続いて起こる時間値の間隔。時間が等間隔でサンプリングされない場合、増分は NaN です。

  • Length — 時間ベクトルの長さ (読み取り専用)

  • Format — 日付文字列の表示形式を定義する文字列。詳細は、MATLAB 関数 datestr のリファレンス ページを参照してください。

  • StartDate — 基準日を定義する日付文字列。詳細については、MATLAB 関数 setabstime のリファレンス ページを参照してください。

  • UserData — 追加のユーザー定義情報を保存します

時系列コレクションのメソッド

時系列コレクションの一般的なメソッド.  次のメソッドを使用して、オブジェクト プロパティのクエリと設定を行い、データをプロットします。

プロパティをクエリするメソッド

メソッド

説明

get

tscollection オブジェクトのプロパティ値をクエリします。

isempty

tscollection オブジェクトが空の場合は true を返します。

length

時間ベクトルの長さを返します。

plot

コレクションの時系列をプロットします。

set

tscollection プロパティ値を設定します。

size

tscollection オブジェクトのサイズを返します。

日付と時間を取り扱うメソッド.  次のメソッドを使用して、データ サンプルの追加または削除を行ったり、tscollection オブジェクトを取り扱います。

日付と時間を取り扱うメソッド

メソッド

説明

addts

tscollection オブジェクトに timeseries オブジェクトを追加します。

addsampletocollection

tscollection オブジェクトにデータ サンプルを追加します。

delsamplefromcollection

tscollection オブジェクトから、1 つまたは複数のデータ サンプルを削除します。

getabstime

tscollection オブジェクトから cell 配列に日付文字列の時間ベクトルを抽出します。

getsampleusingtime

既存の tscollection オブジェクトから新しい tscollection オブジェクトへデータ サンプルを抽出します。

gettimeseriesnames

tscollection オブジェクトの時系列名の cell 配列を返します。

horzcat

tscollection オブジェクトの水平連結。同じ時間ベクトルをもついくつかの timeseries オブジェクトを 1 つの時系列コレクションにまとめます。

removets

tscollection オブジェクトから 1 つまたは複数の timeseries オブジェクトを削除します。

resample

新しい時間ベクトルを用いて、tscollection オブジェクトのデータを選択または内挿します。

setabstime

tscollection オブジェクトの時間ベクトルの時間値を日付文字列として設定します。

settimeseriesnames

tscollection オブジェクトの選択した timeseries オブジェクトの名前を変更します。

vertcat

tscollection オブジェクトの垂直連結。時間の次元に沿った複数の tscollection オブジェクトを連結します。