2

每个人。

我有一些定期更新的数据。例如:

1330347541 79 100 6 163 38
1330349341 80 103 6 165 38
1330351141 80 104 6 166 40
1330352941 80 104 6 166 40
1330354741 81 104 8 167 41

我想用 gnuplot 在图表上绘制这些数据。

如何提取一个月前到现在的数据?我需要选择哪个xrange?

编辑:我需要类似“set xrange [now - 2592000, now]”的东西

4

3 回答 3

2

我有一个类似的问题。虽然你没有确切地展示你是如何做这个情节的。我希望使用时间戳设置范围并发现了一些意想不到的东西。. . 所以虽然老了,但我认为值得回答这个问题。

两个有用的东西:

  1. 您可以将 xrange 设置为 [*.*] 进行绘图,然后“显示 xrange”以找出 gnuplot 正在使用的 xrange 的内部表示。

  2. 您可以在 gnuplot 中使用 () 来插入计算和函数调用。

答案 #1您是否使用时间列进行绘图?在 gnuplot 4.7 之前,gnuplot 内部时间是相对于 2000 年 1 月 1 日进行跟踪的,而不是 1970 年 1 月 1 日的 unix 纪元。答案取决于您使用的是哪个版本的 gnuplot?您可以在 gnuplot 中使用 () 来调用函数或进行计算。您可以调用 shell 命令 date 来获取时间戳。所以 。. .

set xrange [(system("date -d 'now' +%s")-2592000):(system("date -d 'now' +%s"))]
show xrange
    set xdata time
    set xrange [ "1431007547" : "1431008547" ] noreverse nowriteback

在 gnuplot 4.7 之前,您还必须从所有时间戳中减去 946684800 秒。实际上,我发现大约 1893370441 秒 =~ 60 年是我必须用我的 gnuplot (4.6) 版本减去的值。通过在不设置 xrange 的情况下对时间戳数据进行绘图来查找时间戳偏移量,然后执行“显示 xrange”并计算偏移量。

所以定义使用的偏移量并设置 xrange 如下:

####################################################################
## 1893456000 = 60 years seems to be the offset gnuoplot is using.##
## or is it 1893370441 ? yeah it seems to be a bit short of 60 years.
## I believe 946684800 should be the offset prior to 4.7.         ##
####################################################################
TIMEOFFSET=946684800
TIMEOFFSET=1893370441
set xrange [(system("date -d 'now' +%s")-2592000-TIMEOFFSET):(system("date -d 'now' +%s")-TIMEOFFSET)]

答案 #2您的 xrange 实际上是否在数据文件行中?(即不使用时间列)。在这种情况下,根据数据行设置您的 xrange。如果您的数据是周期性的,您可以计算返回的行数 = 特定时间段。

我碰巧正在使用这个版本的gnuplot:

    Version 4.6 patchlevel 1    last modified 2012-09-26 

更多细节和探索...

绘制数据的基本图:

set xdata time
set timefmt "%s"
set timefmt x "%s"
set format x "%H:%M"
plot "lollo.data" using 1:2, "lollo.data" using 1:3

好的,现在在数据中设置一个从第一个到最后一个时间戳的简单 xrange。

set xrange [1330347541:1330351141]
plot "lollo.data" using 1:2, "lollo.data" using 1:3
                                               ^
     all points y value undefined!

哇!?真的吗?那有什么问题?让我们执行 'show xrange' 来查看 gnuplot 认为的范围是什么。

show xrange
    set xdata time
    set xrange [ "1330347541" : "1330351141" ] noreverse nowriteback

看起来没问题。让我们将 xrange 设置为 *:* (gnuplot 以什么开始(您也可以执行 'set xrange restore' 但将其设置为 [-10:10] - 不是我们想要的)),做一个绘图然后显示 xrange .

set xrange [*:*]
plot "lollo.data" using :2, "lollo.data" using :3
show xrange
    set xdata time
    set xrange [ * : * ] noreverse nowriteback  # (currently ["0":"4"] )

嗯。0:4!!有趣的。看起来 xrange 正在不及时地对数据行进行操作。所以。这是你的问题吗?假设 xrange 将在时间戳而不是行中工作?知道了这一点,您也许可以按行设置 xrange。==答案 #2

现在。让我们使用 timecolumn 绘制数据。

set xrange [*:*]
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3
show xrange
    set xdata time
    set xrange [ * : * ] noreverse nowriteback  # (currently ["-563022900":"-563014800"] )

哎呀!-563022900 !?负时间戳。有趣的。那么这个版本的gnuplot中的时间戳整数计算怪异/功能?

让我们尝试在数据中设置从第一个到最后一个时间戳的简单 xrange,并使用 timecolumn 进行绘图。

set xrange [1330347541:1330351141]
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3
                                                                           ^
     all points y value undefined!

它不喜欢那样。如果它在内部处理负时间戳数字是可以理解的。

让我们使用 () 来设置负范围 LESS 一个月的秒数来包围计算:

set xrange [(-563014800-2592000):-563014800]
plot "lollo.data" using (timecolumn(1)):2, "lollo.data" using (timecolumn(1)):3

这样可行。为了我。gnuplot 4.6。但是-563014800是从哪里来的!?

$ date -d @1330347541
Mon 27 Feb 12:59:01 GMT 2012
$ dc -e '1330347541 16o p'
4F4B7E15
### ??? I didn't find any hex relation - looking for evidence of integer calc overflow/sign calc errors

# What offset 
$ dc -e '0 1330347541 - 563022900 - p'
-1893370441
# taking a timestamp from today (7 march 2015) and doing a plot I saw gnuplot used xrange with -462448800 . . . 
$ dc -e '0 1431000097 - 462448800 - p'
-1893448897

哈哈!差不多。-1893448897 =~ -1893370441 也就是大约 60 年。所以。正在使用 60 年的补偿。在我的 gnuplot 版本中。有趣的。和耶。所以我似乎需要减去大约 1893456000 秒才能转换为内部 gnuplot 时间戳。实际上 1893370441 似乎更接近需要的东西。

在互联网上的其他地方,据说 gnuplot 的时代是在 2000 年。这应该意味着应该使用 946684800 的偏移量。但现在对我来说似乎不是这样。

YMMV。我猜。

使用该偏移量,您可以像这样设置从一个月前到现在的 xrange:==答案 #1

TIMEOFFSET=1893370441
set xrange [(system("date -d 'now' +%s")-2592000-TIMEOFFSET):(system("date -d 'now' +%s")-TIMEOFFSET)]

在 gnuplot 中如何/为什么会出现这种情况?

来自:http : //gnuplot.10905.n7.nabble.com/30-year-time-offset-reading-nonuniform-matrix-s-input-td17231.html那时还没有使用 unix,所以 2000 似乎和 1970 一样随意。

最初并不打算让它对用户可见,但后来发现您可以在设置时间数据范围之类的事情中使用数字而不是字符串。

我想我还记得,因为时间存储的是一个实数,所以携带一个大的偏移量是不好的,因为这限制了小数字的分辨率。但我认为这在实践中可能无关紧要。

戴夫 D"

于 2015-05-07T16:07:20.243 回答
2

您可以使用 time(x) 函数获取当前系统时间。如果 x 是整数,则返回从 1970 年 1 月 1 日开始的当前时间(以秒为单位)。要设置从一个月前到现在的 x 范围:

set xrange [time(0) - 2592000:time(0)]

(使用 Gnuplot 5.4 测试)

于 2022-03-02T07:32:40.233 回答
1

解决方案:

plot \
    "< awk -v date=`date +'%s'` '{ if ($1 > date - 2592000) print $0; }' datafile" using 1:2 …
于 2012-02-29T08:56:16.950 回答