如何在R中将时间(mm:ss)转换为十进制形式

Posted

技术标签:

【中文标题】如何在R中将时间(mm:ss)转换为十进制形式【英文标题】:How to convert time (mm:ss) to decimal form in R 【发布时间】:2011-07-08 09:39:25 【问题描述】:

我已经使用 RStudio 将 csv 文件导入到 R 中,我正在尝试根据每场比赛的分钟数绘制每场比赛的分数。然而,每场比赛的分钟数采用 mm:ss 格式,我很难找到如何将其转换为十进制形式。

请帮忙!

【问题讨论】:

变量持有时间的类别是什么? 【参考方案1】:

我有这样的时间数据:

22:49:20+1100 19:29:11+1000 20:01:26+0930

这似乎对我有用:

my_df <- my_df %>%
separate(col = eventTime, into = c("H", "M", "S"), sep = "\\:", remove = FALSE) %>% 
separate(col = S, into = c("S", "Z"), sep = "\\+", remove = TRUE) %>% 
separate(col = Z, into = c("ZH", "ZM"), sep = 2, remove = TRUE) %>% 
mutate(H = as.numeric(H)/24) %>% 
mutate(M = as.numeric(M)/24/60) %>% 
mutate(S = as.numeric(S)/24/60/60) %>% 
mutate(ZH = as.numeric(ZH)/24) %>% 
mutate(ZM = as.numeric(ZM)/24/60) %>% 
mutate(H = H-ZH) %>% 
mutate(M = M-ZM) %>% 
mutate(time_num = H+M+S)

H:小时, M:分钟, S:秒, Z:区域, ZH:区域小时, ZM:区域分钟数

如果您不关心时区,那么:

my_df <- my_df %>%
separate(col = eventTime, into = c("H", "M", "S"), sep = "\\:", remove = FALSE) %>% 
separate(col = S, into = c("S", "Z"), sep = "\\+", remove = TRUE) %>% 
mutate(H = as.numeric(H)/24) %>% 
mutate(M = as.numeric(M)/24/60) %>% 
mutate(S = as.numeric(S)/24/60/60) %>% 
mutate(time_num = H+M+S)

第一种方法你可能会得到否定。第二种方法你应该得到介于 0 和 1 之间的值,其中 time_num 是一天中的部分。

例如:

22:49:20+1100 = 0.950925926

07:26:10+1100 = 0.309837963

需要注意的是,我的时间数据都来自一个带正数+的时区

【讨论】:

【参考方案2】:

第一个解决方案的一些调整:

minPerGame <- paste(sample(1:89,100000,T),sample(0:59,100000,T),sep=":")

f1 <- function()
sapply(strsplit(minPerGame,":"),
 function(x) 
  x <- as.numeric(x)
  x[1]+x[2]/60
 
)

#
f2<- function()
 w <- matrix(c(1,1/60),ncol=1)
 as.vector(matrix(as.numeric(unlist(strsplit(minPerGame,":"))),ncol=2,byrow=TRUE)%*%w)


system.time(f1())
system.time(f2())

system.time(f1()) 用户系统已过 0.88 0.00 0.86

system.time(f2()) 用户系统已过 0.25 0.00 0.27

【讨论】:

【参考方案3】:

鉴于您从字符向量开始,这相对容易:

minPerGame <- c("4:30","2:20","34:10")

sapply(strsplit(minPerGame,":"),
  function(x) 
    x <- as.numeric(x)
    x[1]+x[2]/60
    
)

给予

[1]  4.500000  2.333333 34.166667

确保您检查了是否使用了 read.csv() 和选项 as.is=TRUE。否则你必须使用as.character()进行转换。

【讨论】:

我使用stuckey @Joe :所以您发现这是相同的 ;-) 不要忘记使用左侧的 V 符号接受您认为最有帮助的任何一个答案作为正确答案。该站点也可作为其他人的参考(另请参阅常见问题解答)。干杯【参考方案4】:

需要对其进行小数化吗?如果您以正确的格式存储数据,例如作为类POSIXlt 的对象,R 的日期时间类之一,R 将以数字方式正确处理时间。这是我的意思的一个例子:

首先我们创建一些虚拟数据用于说明目的:

set.seed(1)
DF <- data.frame(Times = seq(as.POSIXlt("10:00", format = "%M:%S"), 
                             length = 100, by = 10),
                 Points = cumsum(rpois(100, lambda = 1)))
head(DF)

忽略这里有日期的事实,当我们绘制绘图时它实际上被忽略了,因为所有观察都具有相同的日期部分。接下来我们使用 R 的公式接口绘制它:

plot(Points ~ Times, data = DF, type = "o")

产生这个:

【讨论】:

转换为 as.numeric 来计算平均游戏持续时间变得乏味,因为POSIXt 类将 31/12/1969 23:59:59 为零,但在转换时添加当前日期。所以一个天真的mean(as.numeric(Times))今天会给出错误的结果,明天会给出不同的错误结果...... @Joris 同意,但@Joe 询问有关绘图的问题,因此我问他是否需要小数化。在我写完我的答案后,我意识到你明确地处理了这个问题,所以我没有打扰它,因为我们之间我们涵盖了大多数基础。 哎呀,我错过了关于绘图的问题。 :-) 那么确实非常+1。

以上是关于如何在R中将时间(mm:ss)转换为十进制形式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用脚本在 Google 表格中将时间转换为十进制浮点数?

将分钟转换为 HH:MM:SS - Swift

如何在 PHP 中将“MM:SS.MS”转换为“SS.MS”?

如何在 SQL 中将小时、分钟和秒 (HH:mm:ss) 转换为分钟和秒 (mm:ss)

在 Python 中将二进制数组转换为十进制(相当于 R readBin?)

在R中将十六进制转换为十进制