Преобразование десятичной дроби / дроби, представляющей дни, в ее фактическое время в R?
В моем наборе данных есть столбец R со значениями, которые были преобразованы в то, что, по моему мнению, является десятичной дробью времени, основанной на днях. Я использовал этот сайт в качестве ссылки: http://www.calculatorsoup.com/calculators/time/decimal-to-time-calculator.php
Который конвертирует 0.3408565 дней, соответствует времени 8:10:50, выполнив следующее:
0.3408565 * 24 hours/day = 8.180555544 = 8 hours
0.180555544 * 60 minutes = 10.83333264 = 10 minutes
0.83333264 * 60 seconds = 49.9999584 = 50 seconds
Как вы можете видеть, это извлечение остатка и дальнейшее умножение, однако я не уверен, как я мог бы реализовать процесс в R. Я хочу преобразовать все значения в моем столбце, используя это, чтобы я мог заменить 0.3408565, 0.3864468, 0.4400231 и т.д. с их фактическими временными аналогами 8:10:50, 09:16:29, 10:33:38 соответственно. Это похоже на то, как это делается в Excel.
Я попытался написать свою собственную функцию, которая на английском языке делает:
convertTime <- function(x)
{
x * 60 = Hour
x2 * 24 = Min
x3 * 24 = Sec
hourChar <- as.character(Hour)
minChar <- as.character(Min)
secChar <- as.character(Sec)
paste(hourChar, minChar, secChar, sep=":")
}
С x = 0.3408565, но, конечно, это не извлекает остаток. Я мог бы серьезно усложнить это, но я хочу перебрать все значения в столбце, используя каждое значение в качестве входных данных для преобразования.
Наконец, я посмотрел на пакеты типа lubridate, но не могу найти ничего, что имеет отношение к моей проблеме.
Я также просмотрел здесь мою конкретную ситуацию, но не смог найти ничего действительно относящегося к моей проблеме. Есть ли какой-нибудь пакет или решение, которое может мне помочь?
РЕДАКТИРОВАТЬ: я хочу сказать, что оба ответа отлично работают для всех, кто имеет такие проблемы, спасибо вам обоим!
2 ответа
Вот пользовательская функция
convertTime <- function(x){
Hour = (x * 24) %% 24 #For x>1, only the value after decimal will be considered
Minutes = (Hour %% 1) * 60
Seconds = (Minutes %% 1) * 60
hrs = ifelse (Hour < 10, paste("0",floor(Hour),sep = ""), as.character(floor(Hour)))
mins = ifelse (Minutes < 10, paste("0",floor(Minutes),sep = ""), as.character(floor(Minutes)))
secs = ifelse (Seconds < 10, paste("0",round(Seconds,0),sep = ""), as.character(round(Seconds,0)))
return(paste(hrs, mins, secs, sep = ":"))
}
ИСПОЛЬЗОВАНИЕ
a = seq(0,1,0.2)
convertTime(a)
#[1] "00:00:00" "04:48:00" "09:36:00" "14:24:00" "19:12:00" "00:00:00"
b = 0.3408565
convertTime(b)
# [1] "08:10:50"
Пытаться times
в хрон, который представляет время как доли дня:
library(chron)
format(times(0.3408565))
## [1] "08:10:50"
Если у вас есть что-то вроде х = 3,3408565 дней, то это можно отформатировать как:
x <- 3.3408565
paste(x %/% 1, times(x %% 1))
## [1] "3 08:10:50"
Что касается предмета вопроса, не ясно, что означает "фактическое время в R", но временные интервалы могут быть выражены как "difftime"
объекты, так что если вы хотите конвертировать x
к "difftime"
тогда объект класса R:
as.difftime(x, units = "days")
## Time difference of 3.340857 days
или если вы хотите вычесть x
с текущей даты / времени:
Sys.time() - as.difftime(x, units = "days")
## [1] "2017-01-27 05:00:22 EST"
Также имеется некоторая информация, которая может иметь отношение к колонке R Справка службы R News 4/1, включая информацию о преобразовании даты / времени в Excel в R - https://www.r-project.org/doc/Rnews/Rnews_2004-1.pdf