【问题标题】:In R, why do I get one millisecond difference between POSIXct and POSIXlt?在 R 中,为什么我会在 POSIXct 和 POSIXlt 之间得到一毫秒的差异?
【发布时间】:2018-02-21 02:08:29
【问题描述】:

这个sn-p

options(digits.secs=3)
s<-"12:00:00.188"
fmt<-"%I:%M:%OS"
print(strptime(s,fmt))
print(as.POSIXct(strptime(s,fmt)))

给出这个文本输出:

[1] "2017-09-12 00:00:00.188 CEST"
[1] "2017-09-12 00:00:00.187 CEST"

虽然我希望上述结果是相同的。我错过了什么?

我的会话信息:

print(sessionInfo())

给予:

R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=Italian_Italy.1252  LC_CTYPE=Italian_Italy.1252    LC_MONETARY=Italian_Italy.1252 LC_NUMERIC=C                  
[5] LC_TIME=Italian_Italy.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.4.0 tools_3.4.0   

Linux 中的结果相同:

R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.3.3

编辑(Roland'scomment 之后)

也许我错了,但在我看来 0.002 不能用浮点数表示,但 0.002 POSIXct 和 POSIXlt 之间没有区别:

options(digits.secs=3)
s<-"12:00:00.002"
fmt<-"%I:%M:%OS"
print(strptime(s,fmt))
print(as.POSIXct(strptime(s,fmt)))

给予:

[1] "2017-09-12 00:00:00.002 CEST"
[1] "2017-09-12 00:00:00.002 CEST"

【问题讨论】:

  • 浮点精度?看看 unclass(as.POSIXct(...))。
  • @Roland 请看我的编辑。

标签: r posixct strptime posixlt


【解决方案1】:

您可以在日期时间的文档中阅读此内容:https://stat.ethz.ch/R-manual/R-devel/library/base/html/DateTimeClasses.html

特别是:

类“POSIXct”表示自 1970 年初(在 UTC 时区)以来的(有符号)秒数,作为数字向量。

strptime 和另一个类 POSIXlt 以不同方式存储日期时间。

所以亚秒级精度存在问题:

亚秒级精度

类“POSIXct”和“POSIXlt”能够表示秒的分数。 (两种形式的分数转换可能不准确,但精度会超过微秒。)

所以,您会看到POSIXltstrptime 准确地打印了这些:

strptime(s,fmt)
as.POSIXlt(strptime(s,fmt), format = "%Y-%m-%d %H:%M:%OS")

但是,由于POSIXct 会进行计算以将日期表示为数字,因此由于浮点精度、闰秒等原因,它可能会出现不准确的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 2015-05-13
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多