我对类POSIXlt
中微/毫秒的表示/存储的模糊性感到困惑:
打印POSIXlt
对象显示不同的微/毫秒数字作为相应属性的查询(最后一位数字不同)
也许这很有道理,但我发现它有点奇怪。有人可以向我解释一下吗?
微秒
# Change digits for seconds >> microseconds
opts <- options(digits.secs=6)
x <- "2012-07-30 12:10:09.123123"
posix <- as.POSIXlt(x, tz="Europe/Berlin")
> posix
[1] "2012-07-30 12:10:09.123122 Europe/Berlin"
> posix$sec
[1] 9.123123
毫秒
posix$sec <- round(posix$sec, 3)
> posix
[1] "2012-07-30 12:10:09.122 Europe/Berlin"
> posix$sec
[1] 9.123
# Undo option change
options(opts)
此外,这并没有真正添加到claritiy(至少对我来说; - ))
opts <- options(digits.secs=6)
x <- "2012-07-30 12:10:09.123123"
posix <- as.POSIXlt(x, tz="Europe/Berlin")
> posix
[1] "2012-07-30 12:10:09.123122 Europe/Berlin"
> posix$sec
[1] 9.123123
当手动操作'sec'属性时,结果似乎有所不同;我仍然没有真正看到这里的系统性,但添加一个额外的数字 - 最好是Aaaron指出的5
- 似乎得到了理想的结果:
# Workaround: extra digit
posix$sec <- posix$sec+0.0000005
> posix
[1] "2012-07-30 12:10:09.123123 Europe/Berlin"
posix$sec <- 9.123122
> posix
[1] "2012-07-30 12:10:09.123122 Europe/Berlin"
posix$sec <- posix$sec+0.0000005
> posix
[1] "2012-07-30 12:10:09.123122 Europe/Berlin"
posix$sec <- 9.123124
> posix
[1] "2012-07-30 12:10:09.123124 Europe/Berlin"
posix$sec <- posix$sec+0.0000005
> posix
[1] "2012-07-30 12:10:09.123124 Europe/Berlin"
posix$sec <- 9.123125
> posix
[1] "2012-07-30 12:10:09.123124 Europe/Berlin"
posix$sec <- posix$sec+0.0000005
> posix
[1] "2012-07-30 12:10:09.123125 Europe/Berlin"
posix$sec <- 9.123126
> posix
[1] "2012-07-30 12:10:09.123125 Europe/Berlin"
posix$sec <- posix$sec+0.0000005
> posix
[1] "2012-07-30 12:10:09.123126 Europe/Berlin"
options(opts)
会话信息
R version 2.14.1 (2011-12-22)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C
[5] LC_TIME=German_Germany.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
编辑2012-07-31
感谢Aaron我想我找到了一个解决方法,通过简单地添加一个内部用于四舍五入到左边的下一个数字的额外数字来为我提供技巧。
答案 0 :(得分:3)
这是因为R向下舍入以显示时间(就像秒表一样)。因此,当打印整个时间对象时,它会向下舍入。但是当打印它的一部分时,它不再是时间对象,因此适用标准舍入。
浮点表示使得这更加明显,就好像一个数字表示为0.39999999999(或者无论二进制当量是什么)它将显示为0.3,即使在浮点容差范围内,它也等于0.4。
要获得通常的舍入行为,请在显示之前添加0.0005(以获得三位小数)。