gnuplot:从一个月前到现在的情节数据

时间:2012-02-27 11:43:08

标签: time gnuplot xrange

大家。

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

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?

编辑:我需要像"设置xrange [now - 2592000,now]"

2 个答案:

答案 0 :(得分:1)

解决方案:

plot \
    "< awk -v date=`date +'%s'` '{ if ($1 > date - 2592000) print $0; }' datafile" using 1:2 …

答案 1 :(得分:1)

我有类似的问题。 虽然你没有准确地显示你是如何做的情节。 我希望使用时间戳设置范围并发现意外情况。 。 。所以虽然很老,但我觉得值得回答这个问题。

两件有用的东西:

  1. 你可以用xrange设置为[*。*]然后'show xrange'来找出你的gnuplot正在使用xrange的内部重新定位。

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

  3. 回答#1 您是否正在使用时间列进行绘图?在gnuplot之前4.7 gnuplot内部时间相对于2000年1月1日被跟踪,而不是unix时代1-Jan-1970。答案取决于你使用的是什么版本的gnuplot?您可以在gnuplot中使用()来执行调用函数或进行计算。您可以调用shell命令日期来获取时间戳。所以。 。 。

    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,然后执行'show 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!
    

    哇!?真?这有什么问题? 让我们'显示xrange'来看看gnuplot认为范围是什么。

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

    看起来没问题。 让我们将xrange设置为*:*(gnuplot从哪个开始(你也可以'设置xrange恢复'但设置为[-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"] )
    

    Hmmmn。 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"] )
    

    Whoooops! -563022900!?负时间戳。有趣。 那么这个版本的gnuplot中的时间戳整数计算奇怪/特征?

    让我们尝试使用时间列设置数据和绘图中从第一个到最后一个时间戳的简单xrange。

    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
    

    HAH!它大致相同。 -1893448897 =〜-1893370441 那只是大约60年。所以。正在使用60年的抵消额。在我的gnuplot版本中。 有趣。和YEESH。所以我似乎需要减去大约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年那样武断。

    最初并不打算让用户看到它, 但后来发现你可以使用数字而不是字符串 比如设置时间数据的范围。

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

    Dave D“