gnuplot - 如何将读取时间格式转换为 double/float/use 作为函数参数

gnuplot - how to convert read time format to double/float/use it as function parameter

我在 gnuplot 中读入时间值有问题。我有一个数据文件

#data.dat
00:50.254
00:50.435
00:51.356
00:53.245
00:54.730
...

格式为 '%M:%S'。所以我正在用我的 gnuplot 文件读取它:

set xdata time
set timefmt "%M:%S"
set xtics format "%M:%S"

set grid
set xrange [ 0:"01:30" ]
set yrange [0:10]
set xtics "00:00",10,"01:30"
set mxtics 2
set ytics 0,2,10
set mytics 2

p 'data.dat' u 1:1

这里我真的想把数据画出来1:1作为测试。结果是:我将只获得 '%M' 的值作为 y 值。这可以通过使用 set ydata time 来纠正。但我想用时间数据做一些计算,需要秒(或秒,包括分钟,诸如 %M*60+%S: 01:30->90)。我想将它传递给一个函数,或者在我的特殊情况下:在函数中进行一些计算后用 smooth freq 求和:

bin(x) = floor(x+0.5)
p 'data.dat' u (bin()):(1.0) smooth freq w boxes

如何访问 %S 部分时间?
如何将读入时间转换为 double/float?

提前感谢您的帮助!

edit: 发帖后灵机一动:读入的数据是不是一个数组,我可以读出这个数组?我试试看。

edit2:internal error : non-STRING argument...这没有用
在我的特殊情况下,我可以使用 : 作为分隔符,并将分钟和秒作为两个列读出……我也会试一试。但这不会有帮助,如果有更多的列需要绘制其他数据...

edit3: 即使设置了分隔符(separator)也没有解决问题,而是出现错误信息: Bad format character 在我的 plot 行。
这是我的新 gnuplot 命令文件:

set datafile separator ':'

set timefmt "%M:%S"
set xtics format "%M:%S"

set grid
#set xrange [ 0:"01:30" ]
set xrange [0:90]
set yrange [0:92]
#set xtics "00:00",10,"01:30"
set xtics 0,10,90
set mxtics 2
set ytics 0,2,10
set mytics 2

p 'data.dat' #u 1:2 #(*60+):()

在内部,gnuplot 将时间存储为自某个纪元以来的秒数(各个版本之间的纪元不同,但在 5.0 行中是 Unix 纪元)。

通常,使用时间格式设置,gnuplot 会自行处理转换。但是,有些函数也可以用于手动处理时间,例如

strptime("%M:%S","50.254")

会将第一行的时间处理成秒数。我们甚至可以在绘图命令中使用它,只要我们小心地将列读取为字符串

plot "data.dat" u 0:(strptime("%M:%S",strcol(1)))

将根据经过的秒数与行号绘制数据文件。由于您没有在时间格式中指定日期信息,gnuplot 默认为纪元第一天的开始,所以我们只需要 50 秒(否则数字可能会更大)。

一般来说,您可以像这样处理任何时间格式。如果您的时间格式中有空格等,这可能会有点困难,因为如果不设置时间格式,您将无法依靠 gnuplot 的能力来知道将 "chunk" 放入列中多少(但是这可以通过使用不同的分隔符或引用时间来处理)。

有关将时间格式转换为内部表示的函数,请参阅 help strptime,有关将这些内部表示之一转换回日期字符串的函数,请参阅 help strftime