Гнуплот: как правильно интерпретировать негативные времена? - PullRequest
1 голос
/ 02 апреля 2020

У меня есть проблема с отрицательным временем в gnuplot.

По сути, я хотел бы написать отрицательное время, например, как -00:01:00, но gnuplot не интерпретирует его как -60 секунд, а как +60 секунд. Я могу как-то понять почему: потому что -00 часов равно +00 часам, а затем 01 минут считаются положительными.

Я что-то пропустил? Может быть, есть простое решение?

Дополнительные примеры приведены ниже. Давайте конвертируем несколько раз в формат %H:%M:%S (на самом деле %tH:%tM:%tS). Я в порядке со всеми строками, кроме строки 6. Строка 7 будет интерпретироваться как %tH:%tM без секунд, поэтому -3660 секунд.

Код:

### 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

Результат:

 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 Ответ

1 голос
/ 03 апреля 2020

Ниже приведена попытка включить возможность ввода отрицательного времени, начиная с -00 часов %tH:%tM:%tS (или минут %tM:%tS).

Он будет обрабатывать случаи 4 и 6 иначе, чем gnuplot в настоящее время. Сделаю. Обходной путь будет обрабатывать случаи, которые имеют отрицательные или -00 часы и дополнительно отрицательные минуты или секунды (случаи 7-14 и 16-17) так же, как это делает gnuplot. Ну, последние все равно странные форматы.

Код:

### 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

Результат:

         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
...