将表示天数的时间小数/分数转换为R中的实际时间?

时间:2017-01-30 17:07:23

标签: r time-format datetime-conversion

我的数据集中有一个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 个答案:

答案 0 :(得分:1)

在chron中尝试times,表示时间为一天的分数:

library(chron)
format(times(0.3408565))
## [1] "08:10:50"

如果您有类似x = 3.3408565天的内容,则可将其格式化为:

x <- 3.3408565
paste(x %/% 1, times(x %% 1))
## [1] "3 08:10:50"

关于问题的主题,目前尚不清楚R&#34;中的实际时间是多少?表示但是时间间隔可以表示为"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 News 4/1的R Help Desk专栏相关,包括有关在R中转换Excel日期/时间的信息 - https://www.r-project.org/doc/Rnews/Rnews_2004-1.pdf

答案 1 :(得分:1)

这是一个自定义功能

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 = ":"))
}

<强> USAGE

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"