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
。
我在 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
。