Я работаю с некоторыми временными метками:
pageviews$timestamp %>% head()
[1] "1605859226452" "1605859226461" "1605859248803" "1605859261112" "1605859283839" "1605859471370"
Мне нужно преобразовать их в дату и время и сохранить на максимально возможном уровне детализации, я думаю, миллисекунды.
Ранее пробовал использовать as.POSIXct:
strtime_to_dt <- function(x) {
as.POSIXct(as.numeric(x) / 1000, origin = "1960-01-01", formats = "%Y-%m-%d %H:%M:%OS")
}
x <- pageviews$timestamp %>% head() # same data as above
> strtime_to_dt(x)
[1] "2010-11-20 08:00:26 UTC" "2010-11-20 08:00:26 UTC" "2010-11-20 08:00:48 UTC" "2010-11-20 08:01:01 UTC" "2010-11-20 08:01:23 UTC"
[6] "2010-11-20 08:04:31 UTC"
Это возвращает дату и время на втором уровне. Как я могу получить его на миллисекундном уровне?
(Было бы здорово, если бы это можно было сделать в tidyverse или lubridate, но я возьму что угодно)
РЕДАКТИРОВАТЬ на основе комментариев некоторые временные метки:
x
timestamp
1 1605859226452
2 1605859226461
3 1605859248803
4 1605859261112
5 1605859283839
6 1605859471370
Обновленная функция:
strtime_to_dt <- function(x) {format(strtime_to_dt(x), "%F %H:%M:%OS3")}
strtime_to_dt(x)
Error: C stack usage 7969908 is too close to the limit
Добавление информации о сеансе()
sessionInfo()
R version 4.0.3 (2020-10-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04 LTS
Matrix products: default
BLAS/LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.8.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=C LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] 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
other attached packages:
[1] DBI_1.1.0 jsonlite_1.7.1 googleAnalyticsR_0.8.0 lubridate_1.7.9 forcats_0.5.0
[6] stringr_1.4.0 dplyr_1.0.2 purrr_0.3.4 readr_1.4.0 tidyr_1.1.2
[11] tibble_3.0.4 ggplot2_3.3.2 tidyverse_1.3.0
loaded via a namespace (and not attached):
[1] tinytex_0.27 tidyselect_1.1.0 xfun_0.19 haven_2.3.1 gargle_0.5.0 colorspace_1.4-1 vctrs_0.3.4
[8] generics_0.1.0 utf8_1.1.4 blob_1.2.1 rlang_0.4.8 pillar_1.4.6 withr_2.3.0 glue_1.4.2
[15] bit64_4.0.5 dbplyr_2.0.0 modelr_0.1.8 readxl_1.3.1 lifecycle_0.2.0 munsell_0.5.0 gtable_0.3.0
[22] cellranger_1.1.0 rvest_0.3.6 memoise_1.1.0 curl_4.3 fansi_0.4.1 broom_0.7.2 Rcpp_1.0.5
[29] openssl_1.4.3 backports_1.2.0 scales_1.1.1 fs_1.5.0 bit_4.0.4 googleAuthR_1.3.1 askpass_1.1
[36] hms_0.5.3 digest_0.6.27 stringi_1.5.3 grid_4.0.3 odbc_1.3.0 cli_2.1.0 tools_4.0.3
[43] magrittr_1.5 pacman_0.5.1 crayon_1.3.4 pkgconfig_2.0.3 ellipsis_0.3.1 xml2_1.3.2 reprex_0.3.0
[50] assertthat_0.2.1 httr_1.4.2 rstudioapi_0.11 R6_2.5.0 compiler_4.0.3
Привет @akrun, хорошо... где? Как?!
Пробовал менять "%Y-%m-%d %H:%M:%OS"
на "%Y-%m-%d %H:%M:%OS3"
и "%Y-%m-%d %H:%M:OS"
ни один из них не помог
Если вам нужно показать вывод в виде символа, вы можете использовать strftime
или format
, и он покажет миллисекунды
Вы можете проверить str1 <- "1605859226452"; format(strtime_to_dt(str1), "%F %H:%M:%OS3") [1] "2010-11-20 02:00:26.451"
Это дает Error: unexpected string constant in " format(strtime_to_dt(str1), "%F %H:%M:%OS3") "2010-11-20 02:00:26.451""
Код format(strtime_to_dt(str1), "%F %H:%M:%OS3")
@akrun Я попробовал вашу функцию, но, пожалуйста, посмотрите мои правки. Получение «Ошибка: использование стека C 7969908 слишком близко к пределу»
У вас есть строка символов, как показано в первой строке
Я попытался преобразовать в символ: x <- as.character(x) > x [1] "c(\"1605859226452\", \"1605859226461\", \"1605859248803\", \"1605859261112\", \"1605859283839\", \"1605859471370\")" > strtime_to_dt(1605859226452) Error: C stack usage 7969908 is too close to the limit > strtime_to_dt('1605859226452') Error: C stack usage 7969908 is too close to the limit
Вам может понадобиться as.character(x$timestamp)
Вы должны иметь возможность использовать strtime_to_dt <- function(x) format(as.POSIXct(x / 1000, origin = "1960-01-01"), format = "%F %H:%M:%OS3")
(хотя это, конечно, возвращает строку символов даты, а не фактический объект даты).
@DougFir Можете ли вы проверить решение, которое я опубликовал. Меня устраивает
Мы можем
format(strtime_to_dt(as.character(x$timestamp)), "%F %H:%M:%OS3")
#[1] "2010-11-20 02:00:26.451" "2010-11-20 02:00:26.460" "2010-11-20 02:00:48.802" "2010-11-20 02:01:01.111" "2010-11-20 02:01:23.838"
#[6] "2010-11-20 02:04:31.369"
x <- structure(list(timestamp = c(1605859226452, 1605859226461, 1605859248803,
1605859261112, 1605859283839, 1605859471370)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
Привет, попробовал: x <- pageviews$timestamp %>% head > x [1] "1605859226452" "1605859226461" "1605859248803" "1605859261112" "1605859283839" "1605859471370" > format(strtime_to_dt(as.character(x)), "%F %H:%M:%OS3") Error: C stack usage 7972244 is too close to the limit
@DougFir неважно, у меня он работает правильно.
:( Я тоже пытался использовать структуру (список...) и получил ту же ошибку. Думаю, это уникально для моей настройки
@DougFir, вы можете попробовать новый сеанс R. Я использую R 4.0.3 на Mac
Да попробую новую сессию сейчас. Я тоже опубликовал sessionInfo()
@DougFir Вы получаете ту же ошибку с strtime_to_dt(as.character(x$timestamp))
Да, та же ошибка с strtime_to_dt(as.character(x$timestamp))
Свежая сессия: 1) pageviews %>% head() %>% pull(timestamp) %>% dput c("1605859226452", "1605859226461", "1605859248803", "1605859261112", "1605859283839", "1605859471370")
2) функция: strtime_to_dt <- function(x) {format(strtime_to_dt(x), "%F %H:%M:%OS3")}
(кажется, это уже chr, поэтому удалено как.char, но пробовал этот вариант
@DougFir Я понимаю v1 <- c("1605859226452", "1605859226461", "1605859248803", "1605859261112", "1605859283839", "1605859471370"); format(strtime_to_dt(v1), "%F %H:%M:%OS3") [1] "2010-11-20 02:00:26.451" "2010-11-20 02:00:26.460" "2010-11-20 02:00:48.802" "2010-11-20 02:01:01.111" "2010-11-20 02:01:23.838" [6] "2010-11-20 02:04:31.369"
3) y <- pageviews %>% head() %>% pull(timestamp) > y [1] "1605859226452" "1605859226461" "1605859248803" "1605859261112" "1605859283839" "1605859471370"
Тогда strtime_to_dt(y) Error: C stack usage 7972356 is too close to the limit
v1 <- c("1605859226452", "1605859226461", "1605859248803", "1605859261112", "1605859283839", "1605859471370") > format(strtime_to_dt(v1), "%F %H:%M:%OS3") Error: C stack usage 7974692 is too close to the limit
Это может быть что-то связанное с вашей ОС, так как я не могу это воспроизвести.
Спасибо за попытку все равно. Принимаю, так как ваш ответ явно работает, но не в моей ОС
Вы можете указать
OS3