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);
プロットしたいときはtimeseries
とplot
を使う。ただし、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