R小数秒的舍入问题

时间:2018-02-08 16:12:24

标签: r time sequence

我正在尝试为频率为10Hz(即0.1秒的时间段)采样的时间序列创建一个序列

关注this post我使用了:

> options(digits.secs=4)

然后:

> time.seq = seq(from=as.POSIXlt("00:00:00.0", format="%H:%M:%OS",tz="GMT"),                   length.out=10, by=0.10)

返回:

> head(time.seq)
[1] "2018-02-08 00:00:00.0 GMT" "2018-02-08 00:00:00.0 GMT"
[3] "2018-02-08 00:00:00.2 GMT" "2018-02-08 00:00:00.2 GMT"
[5] "2018-02-08 00:00:00.4 GMT" "2018-02-08 00:00:00.5 GMT"

这是不对的。 2应该是:

"2018-02-08 00:00:00.1 GMT"

和[4]

"2018-02-08 00:00:00.3 GMT"

最初我认为问题出在格式化或getOption上,但似乎并非如此,因为如果我使用不同的部分,它会完美运行:

> time.seq = seq(from=as.POSIXlt("00:00:00.0", format="%H:%M:%OS",tz="GMT"),                   length.out=10, by=0.0315)
> head(time.seq)
[1] "2018-02-08 00:00:00.0000 GMT" "2018-02-08 00:00:00.0315 GMT"
[3] "2018-02-08 00:00:00.0629 GMT" "2018-02-08 00:00:00.0945 GMT"
[5] "2018-02-08 00:00:00.1259 GMT" "2018-02-08 00:00:00.1575 GMT"

所以这意味着存在一些舍入错误。

有人有任何想法如何解决这个问题,好吗?我在OS X(High Sierra)上使用R 3.4.1

谢谢!

UPDATE 从this post我可以看到,这是添加中的浮点错误。在Matthew Lundberg的帖子中使用'form'格式化函数,我得到了:

f4 <- "%Y-%m-%d %H:%M:%OS4"
> time.seq = seq(from=as.POSIXlt("00:00:00.0", format="%H:%M:%OS",tz="GMT"),                   length.out=10, by=0.10)
> format(time.seq[1], f4)
[1] "2018-02-09 00:00:00.0000"
> format(time.seq[2], f4)
[1] "2018-02-09 00:00:00.0999"
> format(time.seq[3], f4)
[1] "2018-02-09 00:00:00.2000"

这可能意味着由于某种原因,R中的格式化没有提取我的选项设置:

> options(digits.secs=4)

1 个答案:

答案 0 :(得分:0)

之间确实存在不一致
  • format.POSIXlt(也由print.POSIXlt调用)确定必要相关数字的数量(将getOption("digits.secs")视为 max ,但在你的情况下,相关数字只有1,因为.099999四舍五入到4位数仍然是.1000)

  • format.POSIXlt调用的内部代码为.Internal(format.POSIXlt(x, format, usetz)),可能只是将(或楼层?)切割为确定的相关数字位数,而不实际舍入同样的方式

修改
有时间查看链接的帖子how-r-formats-posixct-with-fractional-seconds,我猜其他所有内容都已在那里进行过讨论/讨论,特别是如果你达到60秒就可以更多地参与其中,这可能是事情发生的主要原因就像他们一样。