日付時刻データ

index

timefmt を使う方法

用いるデータの中に出現する日付時刻のフォーマットがただ一通りの場合に有効.

まず、 読み込むデータの x 及び y が日付時刻であることを宣言する必要がある.

set xdata time
set ydata time

日付時刻データのフォーマットはデフォルトでは "%d/%m/%y,%H:%M" である. %-指定子の意味は後述. C言語の printf みたいな感じでフォーマットを作って、

set timefmt <format>

を用いて自由にフォーマットを変更できる.

また xtics ytics の表示に関しても、そのフォーマットを別途指定する必要がある (timefmt に勝手に揃う気がしてたんだけど、バージョンによるのかもしれない).

set format x <format>
set format y <format>

この <format> も先ほどのと同じ、%-指定子を用いた文字列である.

timeformat %-指定子

format explanation
%d 日 (1-31)
%m 月 (1-12)
%y 年の下2桁 (0-99)
%Y 年の4桁
%j day of the year (1-365)
%H 時 (0-24)
%M 分 (0-60)
%S 秒 (0-60)
%s UNIX time
%B 月の英語表記
%b 月の英語表記 (3文字省略形)

時刻表示の中にスペース文字など、通常区切り文字として使われるようなものが含まれることが多々ある. そういうときのために using 1:2 などを明示的に指定する必要がある.

set terminal pngcairo size 700,400
set output 'data.timefmt.png'

set xdata time
set timefmt '%Y/%m'
set format x '%Y/%m'
set grid
plot 'data.timefmt.dat' u 1:2 smooth cspline
# data.timefmt.dat
2015/07 2677
2015/08 5065
2015/09 3763
2015/10 3732
2015/11 2990
2015/12 5449
2016/01 4932
2016/02 6653
2016/03 2899
2016/04 3968
2016/05 2497
2016/06 2729
2016/07 2890
2016/08 3106
2016/09 3797
2016/10 2929
2016/11 2634
2016/12 3288
2017/01 3397
2017/02 4581
2017/03 4567
2017/04 3535
2017/05 4122
2017/06 2998
2017/07 3491
2017/08 4481
2017/09 4054
2017/10 3459

異なるフォーマットを共存させるには

xy が異なるフォーマットの日付時刻データである、 あるいは複数のデータを同時にプロットさせるに当たって別のフォーマットが使われてるなどの場合、 異なるフォーマットを指定したい. set timefmt は設定を上書きするだけで、 plot 時点での設定が使われるので、 基本的に1つのフォーマットしか使えない.

StackOverFlow の "Plot two files in gnuplot with different timefmt" という質問にあった回答の https://stackoverflow.com/a/31009235 で出来た. using の中で strptime 関数を直接呼び出せばよい. gnuplot 5.0 以上ならより簡素な timecolumn 関数の方が便利

timecolumn 関数を使って、x, y で別のフォーマットが使われているデータをプロットする.

set terminal pngcairo size 700,400
set output 'data.timefmt2.png'

$data << EOD
2017-10-23 13:43:00
2017-10-24 14:37:45
2017-10-25 14:18:06
2017-10-26 14:31:48
2017-10-27 12:12:41
2017-10-30 13:56:49
EOD

set xdata time
set ydata time

xformat = '%Y-%m-%d'  # parse format (for timecolumn)
yformat = '%H:%M:%S'

set format x '%m/%d'  # tics format
set format y '%H:%M'

plot $data using (timecolumn(1, xformat)):(timecolumn(2, yformat)) w lp