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