【问题标题】:R lubridate ymd_hms millisecond diffR lubridate ymd_hms 毫秒差异
【发布时间】:2019-01-25 16:32:02
【问题描述】:

我在时间转换中缺少什么吗?很简单的例子:

library(lubridate)
time <- "2019-01-14 10:58:23.438000"

op <- options(digits.secs=6)
ymd_hms(time, tz = "Europe/Helsinki")
[1] "2019-01-14 10:58:23.437 EET"

ymd_hms(time)
[1] "2019-01-14 10:58:23.437 UTC"

为什么这里是毫秒一?似乎不是四舍五入的问题?

虽然这似乎可行:

time <- "2019-01-14 10:58:23.123456"

op <- options(digits.secs=6)

ymd_hms(time)
[1] "2019-01-14 10:58:23.123456 UTC"

会话信息

sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

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

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

other attached packages:
[1] lubridate_1.7.4

loaded via a namespace (and not attached):
[1] compiler_3.5.1 magrittr_1.5   tools_3.5.1    yaml_2.2.0     Rcpp_1.0.0     stringi_1.2.4  stringr_1.3.1 

【问题讨论】:

  • 在我的机器上运行你的代码(我也有 lubridate 的 1.7.4 版)甚至不会输出毫秒数。我只得到:"2019-01-14 10:58:23 EET""2019-01-14 10:58:23 UTC"
  • 我添加了选项部分,我可能在运行之前更改了它。
  • 好的,现在我得到了和你一样的输出。

标签: r lubridate


【解决方案1】:

编辑:此答案Milliseconds in POSIXct Class 解决了POSIXct 发生的情况

(请注意,您会遇到舍入错误,并且 R 的日期时间格式总是向下舍入,因此如果您显示的小数位数较少,有时看起来您已经损失了一毫秒。)


ymd_hmsas.POSIXct 似乎存在问题。

如果我直接调用strptime,或者使用as.POSIXlt,毫秒解析正确:

strptime(time, "%Y-%m-%d %H:%M:%OS", tz = "Europe/Helsinki")

as.POSIXlt(time, "%Y-%m-%d %H:%M:%OS", tz = "Europe/Helsinki")

这些选项中的任何一个都可以解决您的问题。

"2019-01-14 10:58:23.438 EET"

POSIXltPOSIXct 的行为不同:

as.POSIXlt(time, "%Y-%m-%d %H:%M:%OS", tz = "Europe/Helsinki") %>% 
  format(., "%Y-%m-%d %H:%M:%OS6")

[1] "2019-01-14 10:58:23.438000"

as.POSIXct(time, "%Y-%m-%d %H:%M:%OS", tz = "Europe/Helsinki") %>% 
  format(., "%Y-%m-%d %H:%M:%OS6")

[1] "2019-01-14 10:58:23.437999"

【讨论】:

  • 似乎并没有截断太多,因为 .123456 在我的理解中正常工作。必须继续思考。
  • 刚刚编辑了指向另一个解决该问题的 SO 问题的链接。虽然我不知道我对 R 在提供一个应该具有精确十进制表示的确定时间时在某处舍入的答案感到满意。
  • 是的,我的问题是我在 tibble 中工作,它不允许 POSIXlt 格式。
  • @Hakki 另见this answer。听起来可能确实是一个浮点问题,除非您需要超出 1e-16 之类的精度,否则它真的不应该是一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 2020-10-13
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多