web-dev-qa-db-fra.com

Convertir l'heure de la date en une chaîne d'heure formatée

Je ne sais pas pourquoi ça ne marche pas. Voici mon code:

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

Mise à jour:

Actuellement, j'ai trouvé cette solution, mais j'espère qu'il y en a une plus élégante:

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

Vous ne savez pas pourquoi vous devez convertir en hms et revenir au format de chaîne initial. Peut être parse_date_time la fonction est ce dont vous avez besoin:

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: Nous pouvons utiliser 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"

Sortie de référence:

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
19
zx8754

Le problème est que class(t) est "Période" et la fonction format.Period() n'a pas de paramètre pour format=. L'objet t n'est pas un objet de style POSIXt standard que vous pouvez être habitué à utiliser avec format(). Seules les fonctions format.POSIXct() et format.POSIXlt() se comporteront comme ça.

Alors peut-être que la chose la plus simple à faire serait de définir une fonction d'aide pour transformer la classe Period en POSIXct. Nous pouvons le faire avec:

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

Il est important de noter que POSIXct est une valeur de date/heure, pas seulement une valeur de temps. Par défaut, nous supposons donc qu'il a commencé à minuit aujourd'hui. Mais alors nous pouvons utiliser le format comme vous le vouliez

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

Je dois admettre que je ne suis pas un utilisateur expert de lubridate, donc j'ai peut-être oublié une fonction évidente, mais il semble que les options de formatage des classes lubridate dans de "jolis" formats soient très limitées.

2
MrFlick

La solution proposée n'imprime pas les zéros non significatifs. La solution suivante semble plus élégante:

> t <- hms("14:01:49") + minutes(3)
> sprintf("%s:%s:%s", hour(t), minute(t), second(t))
[1] "14:4:49" # looking weird
> format(Sys.Date() + t, "%H:%M:%S")
[1] "14:04:49" # looking better
0
shosaco