1

我对类中微秒/毫秒的表示/存储的模棱两可感到困惑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)

此外,这并没有真正增加清晰度(至少对我来说;-))

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”属性时,结果似乎有所不同;我仍然没有真正看到这里的系统性,但是添加一个额外的数字 - 最好是5Aaaron 指出的 - 似乎得到了预期的结果:

# 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,我想我找到了一种解决方法,只需添加一个额外的数字,该数字在内部用于四舍五入到左边的下一个数字。

4

1 回答 1

3

这是因为 R 向下取整以显示时间(就像秒表一样)。所以在打印整个时间对象时,它会向下取整。但是当只打印它的一部分时,它不再是一个时间对象,所以标准的四舍五入适用。

浮点表示使这一点更加明显,就好像一个数字表示为 0.39999999999(或任何二进制等价物),即使在浮点容差范围内,它也将显示为 0.3,它等于 0.4。

要获得通常的舍入行为,请在显示前添加 0.0005(以获得小数点后三位)。

有关更多详细信息,请参阅R 如何使用小数秒格式化 POSIXct

于 2012-07-30T18:11:10.607 回答