如何在gnuplot中设置时区?

8

我有一个简单的gnuplot命令文件:

 ....
set xdata time
set timefmt "%s"
set format x "%H:%M"
....

x是时间戳列。

结果以UTC格式显示时间。我可以更改x轴的本地时区吗?


你能提供一些样本数据吗? - mgilson
我已经尝试过了,但恐怕失败了...但我对时区的strptime魔法不是很擅长,也许其他人可以做到。 - mgilson
我看到这个问题很旧了,而且似乎答案自那时以来并没有改变。我觉得修改数据以获得正确的日期呈现是很糟糕的。新版本有什么改变吗? - Setop
5个回答

7

今天在文档中发现了以下内容:

从秒数转换为日期和时间时,假定使用的是通用时间(与格林威治标准时间相同)。没有考虑更改时区或夏令时的情况。如果所有数据均参考同一时区(并且都处于夏令时或标准时间),则无需担心这些问题。但如果绝对时间对您的应用程序至关重要,则需要自己转换为通用时间。

来自 help time/date


7

我今天刚看到这个。你不需要改变格式,只需改变数据。如果 data.txt 包含 UTC 时间戳,并且你想在 PDT(比 UTC 少7小时)中显示它们,只需使用:

plot 'data.txt' using ($1+(-7*3600)):2

这将从每个x值中减去7小时(以秒为单位)。


1
您可以使用date命令获取偏移量:date +%s -d '1970年1月1日' - anthony
对anthonie评论的一个改进:date +%z返回当前数字时区,而date +%z --date=@1520000000返回纪元时间1520000000的数字时区。 - hermannk

1
这里发布的代码片段对我没有起作用,但是这个好像可以解决问题:
TZ=Europe/Amsterdam tzoff=$(printf "%(%z)T")
tzoff=${tzoff:0:1}$(( ( 10#${tzoff:1:2} * 3600 + 10#${tzoff:3:2}* 60 ) ))
echo $tzoff

1
有点晚了,我的声望还不够高,无法发表评论,但是为了补充Anthony和Hermannk的答案,这是我如何使用他们的信息实现它的方法:
在command.gnuplot中(假设第一个字段包含日期/时间,第二个字段包含Y轴的值): plot "inputfile" using ($1 - offset):2
从(bash)命令行调用gnuplot时:
gnuplot -e "offset=$(date +%s -d '1 Jan 1970')" command.gnuplot
通常偏移量可以正常工作,因为gnuplot内部将日期/时间解释为自纪元以来的秒数。我不知道形式“offset=$(date ...)”是否是bash特定的东西,但你也可以使用“offset='date ...'”代替。
编辑 - 当处理DST /夏令时更改时,我发现这种方法效果不佳。我将偏移计算更改为以下方式,现在它的效果更好:
  • command.gnuplot 中,假设第一个字段包含日期/时间,第二个字段包含 Y 轴的值:

plot "inputfile" using ($1 + offset):2

  • 从(bash)命令行调用 gnuplot 时:

gnuplot -e "offset=$(echo "$(date +%z) * 36" | bc)" command.gnuplot

这是如何工作的?date +%z 提供类似于 -0400 的时区偏移量,这意味着 本地时间 = UTC - 4 小时。如果我们把它当成一个数字(-400),那么偏移量就是 -400 / 100 * 3600 = -400 * 36 秒。请注意,这对于具有 30 分钟增量的时区(印度?)不起作用,但我相信通过一些巧妙的数学处理,你也可以解决这个问题。


0

除了之前的正确答案,还有我是如何在下做到这一点的

4.1版本开始,您可以避免使用forks来执行date命令:

printf -v tzoff "%(%z)T" -1
tzoff=${tzoff:0:1}$(( ( 10#${tzoff:1:2}* 3600 + 10#${tzoff:3:2}* 60 ) ))

一些示例:

TZ=Asia/Katmandu printf -v tzoff "%(%z)T" -1
echo $tzoff 
+0545

tzoff=${tzoff:0:1}$(( ( 10#${tzoff:1:2}* 3600 + 10#${tzoff:3:2}* 60 ) ))
echo $tzoff 
+20700

TZ=America/Chihuahua printf -v tzoff "%(%z)T" -1
echo $tzoff 
-0700

tzoff=${tzoff:0:1}$(( ( 10#${tzoff:1:2}* 3600 + 10#${tzoff:3:2}* 60 ) ))
echo $tzoff 
-25200

然后可以在创建.dat文件时,将这个$ tzoff 添加到值中,或者在绘图命令文件中添加它们。
printf -v plotcmd 'plot \47file.dat\47 using ($1%s):2' $tzoff

echo "$plotcmd"
plot 'file.dat' using ($1-25200):2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接