MATLABでの時系列データの扱い

2012/02/21 20:00:13みたいな書式は人間にとっては良いけど、パソコンで扱う(ソートするとかプロットするとか)には不便なのでタイムスタンプにするのが良い。2012/02/21 20:00:13をタイムスタンプに変換するには次のようにする

t1 = '2012/02/21 20:00:13';
formatIn = 'yyyy/mm/dd HH:MM:SS';
serial_date_number = datenum(t1, formatIn);

プロットしたいときはtimeseriesplotを使う。ただし、timeseriesの時間データ(time)の単位は(デフォルトでは)secondsなので、何も考えないでplotとすると横軸の数値が分けわからなくなる。横軸を2012/02/21 20:00:13みたいに表示したい場合は、以下のようにする。

ts = timeseries(data, (serial_date_number-serial_date_number(1))*86400);
ts.TimeInfo.StartDate = datestr(serial_date_number(1));
plot(ts);

グラフのカスタマイズ~横軸(時刻)のフォーマットを変更~

横軸から日付などを消してHH:MMで表示したときは次の様にする。

ts.TimeInfo.Format = 'HH:MM';
plot(ts);

グラフのカスタマイズ~対数グラフにしたい~

timeseriesクラスにはsemilogyがない(plot(ts)はできてもsemilogy(ts)はエラー)。y軸だけ対数プロットにしたいときは次のようにする。

plot(ts);
set(gca,'YScale','log')

両対数にしたいときは次のようにする。

plot(ts);
set(gca,'XScale','log','YScale','log')

UNIXのタイムスタンプとの互換性

ちなみにmatlabのタイムスタンプはSerial Date Numberと呼ばれていて、UNIXのタイムスタンプと互換性がないので注意。

  • UNIXタイムスタンプは1970年1月1日から経過した秒数
  • Serial Date Numberは0000年1月1日から経過した日数 以上のように、定義が違うので注意。

Serial Date Numberや2012/02/21 20:00:13といった書式との変換には以下の関数を利用する

  • datenum ... 2012/02/21 20:00:13をSerial Date Numberに変換
  • datestr ... Serial Date Numberを2012/02/21 20:00:13に変換

UNIXタイムスタンプをSerial Date Numberにする自作関数

 function dn = unixtime_to_datenum( unix_time )
    dn = unix_time/86400 + 719529;         %# == datenum(1970,1,1)
end

Serial Date NumberをUNIXタイムスタンプにする自作関数

function dn = unixtime_in_ms_to_datenum( unix_time_ms )
    dn = unix_time_ms/86400000 + 719529;   %# == datenum(1970,1,1)
end