如何将时间(mm:ss)转换为小数形式

问题描述 投票:0回答:4

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

r time numeric
4个回答
29
投票

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

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()
进行转换。


9
投票

需要将其十进制化吗?如果您以正确的格式存储数据,例如作为 R 的日期时间类之一

POSIXlt
类的对象,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")

产生这个:

points per game time


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


0
投票

我有这样的时间数据:

  • 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:小时, 男:分钟, 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

应该注意的是,我的时间数据全部来自带有正+的时区

© www.soinside.com 2019 - 2024. All rights reserved.