Преобразовать время даты в форматированную строку времени
Я не знаю, почему это не работает. Вот мой код:
> 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
в "симпатичные" форматы очень ограничены.