R lubridate ymd_hms милисекундная разница - PullRequest
0 голосов
/ 25 января 2019

Что-то мне не хватает в преобразованиях времени?Очень простой пример:

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

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 Ответ

0 голосов
/ 25 января 2019

Редактировать: этот ответ Миллисекунды в классе POSIXct указывают на то, что происходит с POSIXct

(Обратите внимание, что вы получаете ошибки округления и Rформатирование даты и времени всегда округляется вниз, поэтому, если вы показываете меньше десятичных знаков, иногда кажется, что вы потеряли миллисекунду.)


Кажется, проблема существует с ymd_hms, а также as.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"

POSIXlt и POSIXct ведут себя по-разному, однако:

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"
...