gnuplot: how to correctly interpret negative times?

廉价感情. 提交于 2020-04-16 05:47:30

问题


I have some issue with negative times in gnuplot.

Basically, I would like to write a negative time, e.g. as -00:01:00, but gnuplot is not interpreting it as -60 seconds, but as +60 seconds. I can somehow understand why: because -00 hours is equal to +00 hours and then 01 minutes are counted positive.

Did I overlook something? Is there maybe an easy workaround?

More examples are given below. Let's convert some times in the format %H:%M:%S (actually %tH:%tM:%tS). I'm fine with all lines, except line 6. Line 7 will be interpreted as %tH:%tM without seconds that's why it is -3660 seconds.

Code:

### negative times
reset session

$Data <<EOD
1   01:00:00
2   01:00:01
3  -01:00:00
4  -01:00:01
5   00:01:01
6  -00:01:01
7     -01:01
8   00:-01:-01
9   00:-01:01
EOD

myTimeFmt = "%tH:%tM:%tS"

set table $Test
    plot $Data u 1:(strcol(2)):(timecolumn(2,myTimeFmt)) w table
unset table
print $Test
### end of code

Result:

 1      01:00:00         3600
 2      01:00:01         3601
 3     -01:00:00        -3600
 4     -01:00:01        -3601
 5      00:01:01           61
 6     -00:01:01           61
 7        -01:01        -3660
 8      00:-01:-01        -61
 9      00:-01:01         -61

回答1:


The following is an attempt to include the possibility of entering negative times starting with -00 hours %tH:%tM:%tS (or minutes %tM:%tS).

It will handle cases 4 and 6 differently than gnuplot currently will do. The workaround will handle cases which have negative or -00 hours and additionally negative minutes or seconds (cases 7-14 and 16-17) the same way as gnuplot will do. Well, the latter are strange formats anyway.

Code:

### workaround for handling negative times
reset session

$Data <<EOD
1    01:00:00
2   -01:00:00
3    00:01:00
4   -00:01:00
5    00:00:01
6   -00:00:01
7    00:00:-01
8    00:-00:01
9    00:-00:-01
10   00:-01:01
11   00:-01:-01
12  -00:-01:-01
13  -00:-01:01
14  -00:-01:-01
15  -01:01:01
16  -01:-01:-01
17   01:-01:-01
EOD

myTimeFmt = "%tH:%tM:%tS"

myTimeSigned(fmt,s) = s[1:1] eq '-' && strptime("%tH",s)==0 && strptime(fmt,s)>0 ? \
                      -strptime(fmt,s[2:]) : strptime(fmt,s)
myTime(n,fmt) = myTimeSigned(fmt,strcol(n))

set table $Test
    plot $Data u 1:(strcol(2)):(timecolumn(2,myTimeFmt)):(myTime(2,myTimeFmt)) w table
unset table
print $Test
### end of code

Result:

         input       gnuplot  workaround

 1      01:00:00       3600    3600
 2     -01:00:00      -3600   -3600
 3      00:01:00         60      60
 4     -00:01:00         60     -60   # different
 5      00:00:01          1       1
 6     -00:00:01          1      -1   # different
 7      00:00:-01        -1      -1
 8      00:-00:01         1       1
 9      00:-00:-01       -1      -1
 10     00:-01:01       -61     -61
 11     00:-01:-01      -61     -61
 12    -00:-01:-01      -61     -61
 13    -00:-01:01       -61     -61
 14    -00:-01:-01      -61     -61
 15    -01:01:01      -3661   -3661
 16    -01:-01:-01    -3661   -3661
 17     01:-01:-01     3539    3539


来源:https://stackoverflow.com/questions/60995400/gnuplot-how-to-correctly-interpret-negative-times

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!