Преобразовать время даты в форматированную строку времени

Я не знаю, почему это не работает. Вот мой код:

> t <- hms("14:11:49")
> t
[1] "14H 11M 49S"
t <- t + minutes(3)
> format(t, format="%H:%M:%S")
[1] "14H 14M 49S"
# Expected output: "14:14:49"

Update:

В настоящее время я нашел это решение, но я надеюсь, что есть более элегантный:

t <- hms("14:11:49") # example period object
sprintf("%s:%s:%s", hour(t), minute(t), second(t))
#"14:11:49"

Ответ 1

Не уверен, почему вам нужно преобразовать в hms и вернуться к исходному строковому формату. Возможно, функция parse_date_time - это то, что вам нужно:

library(lubridate)
myTime <- "14:11:49"
hms(myTime)
#"14H 11M 49S"

POSIXct_myTime <- parse_date_time(myTime,"hms")
format(POSIXct_myTime, format="%H:%M:%S")
#"14:11:49"

EDIT: Мы можем использовать paste:

t <- hms("14:11:49")
t
#[1] "14H 11M 49S"
t <- t + minutes(3)
t
#[1] "14H 14M 49S"

paste(hour(t),minute(t),second(t),sep=":")
#[1] "14:14:49"

Выход контрольной метки:

op <- microbenchmark(
  Use_paste=paste(hour(t),minute(t),second(t),sep=":"),
  Use_sprintf=sprintf("%s:%s:%s", hour(t), minute(t), second(t)),
  times=1000000L)
op

# Unit: microseconds
# expr    min     lq median     uq      max neval
# Use_paste 28.072 31.695 32.601 33.506 44253.42 1e+06
# Use_sprintf 29.582 33.807 34.412 35.619 44367.52 1e+0

Ответ 2

Проблема заключается в том, что class(t) является "Period", а функция format.Period() не имеет параметра для format=. Объект t не является стандартным объектом стиля POSIXt, который можно использовать для использования с format(). Только теги format.POSIXct() и format.POSIXlt() будут вести себя так.

Поэтому, возможно, проще всего было бы определить вспомогательную функцию, чтобы превратить класс Period в POSIXct. Мы можем сделать это с помощью:

as.POSIXct.Period <- function(x, start=today()) {
    X<-as.interval(x, start); 
    [email protected][email protected]
}

Важно отметить, что POSIXct является значением даты/времени, а не только значением времени. Поэтому по умолчанию мы просто предположим, что он начался сегодня в полночь. Но тогда мы можем использовать формат так, как вам хотелось.

format(as.POSIXct(t), format="%H:%M:%S")
# [1] "14:11:49"

Я должен признать, что я не эксперт lubridate, поэтому, возможно, я упустил очевидную функцию, но кажется, что варианты форматирования классов lubridate в "симпатичные" форматы очень ограничены.