R 带有'的歧义;POSIXlt';包含微秒时的表示

R 带有'的歧义;POSIXlt';包含微秒时的表示,r,datetime,posixct,R,Datetime,Posixct,我对类POSIXlt中微秒/毫秒的表示/存储的模糊性感到困惑: 打印POSIXlt对象显示不同的微秒/毫秒数字,作为对相应属性的查询(最后一位数字不同) 也许这很有道理,但我觉得有点奇怪。有人能给我解释一下吗 微秒 # Change digits for seconds >> microseconds opts <- options(digits.secs=6) x <- "2012-07-30 12:10:09.123123" posix <- as.POSIX

我对类
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
会话信息

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,我想我找到了一个解决办法,可以简单地添加一个额外的数字,用于内部舍入到左边的下一个非整数。

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

浮点表示使这一点更加明显,因为如果一个数字表示为0.399999999(或任何二进制等价物),它将显示为0.3,即使在浮点公差范围内,它也等于0.4

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


有关更多详细信息,请参阅。

能否发布您的
sessionInfo()
?请注意,我无法复制您的第一个示例:
as.POSIXlt(x,tz=“Europe/Berlin”)
为我返回
“2012-07-30 12:10:09.123123 Europe/Berlin”
。请稍等,我将更新帖子刚刚注意到是时候更新R了;-)我会检查我是否得到了与R-2.15.1相同的行为不,对我来说,R-2.15.1也是一样的。好吧,我只能在32位R中复制问题。我怀疑可以表示的位数出现了问题……但是
.123124
的情况不是也一样吗?根据你的回答,R仍然应该向下舍入,但不会。我看到你将它设置为.123124的位置,它显示为.123124,但在没有向下舍入的位置。你能澄清一下吗?我更新了我的帖子。我觉得我仍然不明白浮点数什么时候舍入(向下),什么时候不舍入(例如123123:舍入,.123124:不舍入等等)。谢谢你在这件事上帮助我!仍然没有真正了解这篇文章的内部内容,但是谢谢你给我们提供了指向另一篇文章的指针!似乎有很多变通方法。它们总是向下取整。但有时,数字在内部存储为比您输入的数字多一点(即当您获得输入的数字时),有时存储为少一点(即当您获得一个单位时),具体取决于浮点表示。此外,要获得通常的舍入行为,请添加0.0005,而不是0.0001(以获得小数点后三位)。[我在回答中也添加了这一点。]
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
# 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