Как преобразовать миллисекунды в формат временной метки hh: mm: ss.sss в R

#r #datetime

#r #дата-время

Вопрос:

Хотя, похоже, существует множество сообщений, посвященных этой проблеме или связанным с ней проблемам, я не смог найти сообщение, предоставляющее решение на R. Проблему должно быть легко решить, как только вы узнаете, как это сделать: у меня есть векторы с миллисекундами. Я хотел бы преобразовать их в часы, минуты, секунды (с тремя десятичными знаками). Например:

 x <- c(29, 300, 1000, 213451)
  

Ожидаемый результат таков:

 # "00:00:00.029"  "00:00:00.300"  "00:00:01.000"  "00:03:33.451"
  

То, что я пробовал до сих пор, — это запутанная серия операций:

 hrs = x / (60 * 60 * 1000)
mins = (hrs %% 1) * 60
secs <- sprintf(((mins %% 1) * 60), fmt = '%#.3f')
paste(trunc(hrs), trunc(mins), secs, sep = ":")
[1] "0:0:0.029"  "0:0:0.300"  "0:0:1.000"  "0:3:33.451"
  

Результат лучше, чем ничего, но все же он далек от ожидаемого результата, и, более того, код для его получения далек от простого или элегантного.
Какой более быстрый и элегантный способ преобразовать миллисекунды в формат временной метки?

РЕДАКТИРОВАТЬ: В качестве альтернативы, я пробовал следующее:

 library(chron)
times(x / (24 * 60 * 60 * 1000))
  

Но при этом не удается напечатать десятичные дроби.

Ответ №1:

Вы можете установить, "%OSn" чтобы секунды указывались усеченными до n десятичных знаков, где n находится между 0 и 6.

 format(as.POSIXct(x / 1000, "UTC", origin = "1970-01-01"), "%H:%M:%OS3")

# [1] "00:00:00.029" "00:00:00.300" "00:00:01.000" "00:03:33.450"