将表示天数的时间 decimal/fraction 转换为其在 R 中的实际时间?
Converting a time decimal/fraction representing days to its actual time in 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' 等软件包,但找不到与我的问题相关的任何内容。
我也在这里浏览了我的具体情况,但找不到与我的问题真正相关的内容。有什么软件包或解决方案可以帮助我吗?
编辑: 我想说这两个答案对于遇到此类问题的其他人来说都是完美的,谢谢你们!
在 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"
关于问题的主题,不清楚 "actual time in R" 的含义,但时间间隔可以表示为 "difftime"
个对象,因此如果您想将 x
转换为 "difftime"
class R对象然后:
as.difftime(x, units = "days")
## Time difference of 3.340857 days
或者如果你想从当前的 date/time 中减去 x
:
Sys.time() - as.difftime(x, units = "days")
## [1] "2017-01-27 05:00:22 EST"
在 R 新闻 4/1 的 R Help Desk 专栏中还有一些可能相关的信息,包括有关在 R 中转换 Excel date/times 的信息 -- https://www.r-project.org/doc/Rnews/Rnews_2004-1.pdf
这是一个自定义函数
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"
我的数据集上的 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' 等软件包,但找不到与我的问题相关的任何内容。
我也在这里浏览了我的具体情况,但找不到与我的问题真正相关的内容。有什么软件包或解决方案可以帮助我吗?
编辑: 我想说这两个答案对于遇到此类问题的其他人来说都是完美的,谢谢你们!
在 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"
关于问题的主题,不清楚 "actual time in R" 的含义,但时间间隔可以表示为 "difftime"
个对象,因此如果您想将 x
转换为 "difftime"
class R对象然后:
as.difftime(x, units = "days")
## Time difference of 3.340857 days
或者如果你想从当前的 date/time 中减去 x
:
Sys.time() - as.difftime(x, units = "days")
## [1] "2017-01-27 05:00:22 EST"
在 R 新闻 4/1 的 R Help Desk 专栏中还有一些可能相关的信息,包括有关在 R 中转换 Excel date/times 的信息 -- https://www.r-project.org/doc/Rnews/Rnews_2004-1.pdf
这是一个自定义函数
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"