【问题标题】:Converting a time decimal/fraction representing days to its actual time in R? [duplicate]将表示天数的时间小数/分数转换为 R 中的实际时间? [复制]
【发布时间】:2017-06-15 22:36:15
【问题描述】:

我的数据集的 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”之类的软件包,但找不到与我的问题相关的任何内容。

我也在这里浏览了我的具体情况,但找不到与我的问题真正相关的任何内容。有没有可以帮助我的软件包或解决方案?

编辑:我想说这两个答案都非常适合遇到此类问题的其他人,谢谢你们!

【问题讨论】:

    标签: r time-format datetime-conversion


    【解决方案1】:

    尝试times in chron,它表示时间为一天的一小部分:

    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 中的实际时间”是什么意思,但时间间隔可以表示为 "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

    【讨论】:

    • 我也刚刚尝试过这种方法,再次非常适合我的情况,非常感谢!
    【解决方案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"
    

    【讨论】:

    • 我刚刚尝试了这个解决方案,它非常适合我的情况,非常感谢!您是否会知道如何在不询问其他问题的情况下也可以转换日期?我再次有一个日期(41641),我可以将其转换为 02/01/2014,我认为 41641 是自 01/01/1900 以来的天数?
    • as.Date(41641, origin = "1900-01-01")
    • 这是完美的,非常感谢您的帮助,我只需将其转换为英国时间,我会弄清楚该怎么做!再次感谢您!
    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多