我正在尝试为频率为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)
答案 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秒就可以更多地参与其中,这可能是事情发生的主要原因就像他们一样。