gnuplot:如何正确解释负时间?
gnuplot: how to correctly interpret negative times?
我对 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
以下尝试包括输入以 -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
我对 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
以下尝试包括输入以 -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