R lubridate ymd_hms 毫秒差异

7

我在时间转换方面是否遗漏了什么?以下是一个非常简单的例子:

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 

在我的机器上运行您的代码(我也有版本1.7.4的“lubridate”),甚至不会输出毫秒。我只得到:"2019-01-14 10:58:23 EET"和"2019-01-14 10:58:23 UTC"。 - Ramiro Magno
3
我添加了选项部分,在运行之前可能已经进行了更改。 - Hakki
好的,现在我确实得到了与你相同的输出。 - Ramiro Magno
1个回答

7

编辑:此回答毫秒在POSIXct类中的应用解释了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正常工作。必须继续思考。 - Hakki
1
刚编辑了一下,附上了另一个关于这个问题的SO链接。虽然我不确定我对答案是否满意,因为R在提供具有精确小数表示的明确时间时会四舍五入。 - Mako212
1
是的,我的问题是我正在使用tibble工作,但它不允许POSIXlt格式。 - Hakki
@Hakki 也可以看看这个答案。听起来可能真的是浮点数问题,除非你需要超过1e-16这样的精度,否则这不应该是一个问题。 - Mako212

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接