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?
3 respuestas
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).
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"
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"
Preguntas relacionadas
Nuevas preguntas
r
R es un entorno de software y lenguaje de programación de código abierto y gratuito para computación estadística, bioinformática, visualización y computación en general. Proporcione ejemplos mínimos y reproducibles junto con el resultado deseado. Use dput () para los datos y especifique todos los paquetes no base con llamadas a library (). No incruste imágenes para datos o código, use bloques de código con sangría en su lugar. Para preguntas relacionadas con estadísticas, use https://stats.stackexchange.com.