以毫秒为单位解析 UNIX 时间戳作为时间

Parsing UNIX timestamps in milliseconds as time

版本:gnuplot v5.3.0

上下文

我正在尝试绘制以下 CSV 数据,其中第一列是 UNIX 时间戳(以毫秒为单位),带有浮点符号,第二列是表示即时吞吐量的整数(在 units/s).

...
1.6069112402441587e+12,334
1.606911240244567e+12,335
1.6069112402475227e+12,336
1.6069112402481619e+12,337
...

为此,我编写了以下脚本文件:

set xdata time
set timefmt "%s"

set datafile separator comma

plot "results.csv" u 1:3

我从gnuplot V5文档中了解到,这个版本支持毫秒精度:

The current version of gnuplot stores time to a millisecond precision.

问题

执行 plot 命令后,gnuplot 对 CSV 文件中的每个数据条目抛出以下警告,并且不绘制任何值:

"throughput.plt", line 15: warning: time value out of range

我试过的

我在 内将数据文件第一列的所有条目转换为 UNIX 时间戳(将 e+12 更改为 e+9)。这次plot执行没有任何错误,但精度损失使得图形过于近似以致于无法分析。

gnuplot 中有没有办法以毫秒为单位提取 UNIX 时间戳?

从所有值中减去第一个值。像这样的东西。您也可以为此使用伪列 [=11=]

代码:(编辑:我更喜欢复制粘贴示例,包括数据)

### normalize time data relative to start time
reset session

# create some random test data
set print $Data
x = 1.6069112402441587e+12
y = 333
do for [i=1:10000] {
    print sprintf("%.16f, %d",x=x+rand(0)*10, y=y+int(rand(0)*15)-7)
}
set print

set datafile separator comma
set key top left
set xlabel "relative time in seconds"

plot t=0 $Data u ((t==0 ? (t0=, t=1) : NaN), (-t0)/1000 ):2 w l title "relative time"
### end of code

结果:

如果表示时间的列已经用UNIX时间表示为实数,则不需要set timefmt "%s"。按原样阅读数字就足够了。

但是,您数据中的数字“1.6069112402441587e+12”被解释为 UNIX 时间“52890/12/27 17:24:04 +0000”。所以你会收到消息“警告:时间值超出范围”。这当然不是你想要的时间。

如果您要按原样使用数据,脚本将如下所示。

set xdata time

# set timefmt "%s"    ### This line is not needed!

set datafile separator comma

set format x "%H:%M\n%.4S"
set grid xtics

plot "results.csv" u (/1000):2 w linespoints