Estoy tratando de convertir un número en formato de hora. Por ejemplo: calculo cuánto tiempo debe cargarse un automóvil eléctrico en la estación de carga de 11 kWh.

  • Demanda energética - 2,8 kWh
  • Tiempo de carga = 2,8 kWh / 11 kWh = 0,257 h
  • 0,257 h = 15 min 25 seg. = 00:15:25

¿Cómo puedo convertir 0,257 h en 00:15:25 en R?

6
Inna 17 ene. 2018 a las 16:03

3 respuestas

La mejor respuesta

Basado en el ejemplo, asumiremos que la entrada es menor que 24 (pero si ese no es el caso, estos podrían modificarse para manejar eso dependiendo de la definición de lo que tal entrada debería producir).

1) chron :: times Use chron times de esta manera. times mide los tiempos en fracciones de un día, así que divide las horas (.257) por 24 para obtener la fracción de un día que representa.

library(chron)

times(.257 / 24)
## [1] 00:15:25

Esto le da un objeto de clase cron "times". Si x es un objeto de este tipo, use format(x) para convertirlo en una cadena de caracteres, si lo desea.

2) POSIXct Esto no utiliza paquetes, aunque es más largo. Devuelve el tiempo como una cadena de caracteres. POSIXct mide el tiempo en segundos y multiplica las horas (.257) por 3600, ya que hay 3600 segundos en una hora.

format(as.POSIXct("1970-01-01") + 3600 * .257, "%H:%M:%S")
## [1] "00:15:25"

2a) Esta variación también funcionaría. Es más largo pero no implica factores de conversión. Devuelve una cadena de caracteres.

format(as.POSIXct("1970-01-01") + as.difftime(.257, units = "hours"), "%H:%M:%S")
## [1] "00:15:25"

Actualizaciones: agregado (2). También agregado (2a) y mejorado (2).

6
G. Grothendieck 19 abr. 2018 a las 13:01

La respuesta de @GGrothendieck parece ser el camino a seguir aquí. Pero si tuviera que hacer esto en la base R, podría calcular los componentes de hora, minuto y segundo y construir la cadena de tiempo manualmente:

x <- 2.257                               # number of hours
total <- round(x*60*60, digits=0)        # the total number of seconds
hours <- trunc(total / (60*60))
minutes <- trunc((x - hours) * 60)
seconds <- total %% 60

ts <- paste0(formatC(hours, width=2, flag="0"), ":",
             formatC(minutes, width=2, flag="0"), ":",
             formatC(seconds, width=2, flag="0"))
ts

[1] "02:15:25"

Demo

3
Tim Biegeleisen 17 ene. 2018 a las 13:21

La solución tidyverse usaría el paquete hms:


hms::hms(0.257 * 60^2)  
#> 00:15:25.2

Le da un objeto de las clases hms y difftime. Si quieres una cadena:


format(hms::hms(0.257 * 60^2))
#> [1] "00:15:25.2"
3
ngm 17 ene. 2018 a las 15:19