我有一段时间了,
[1] "9.58" "19.19" "43.03" "1:40.91" "2:11.96" "3:26.00"
[7] "3:43.13" "4:44.79" "7:20.67" "12:37.35" "26:17.53" "26:44"
其中一些只有小数秒。他们中的一些人有几分钟和几小时,并以“:”
分隔我希望所有这些都在一个单位(几秒或几分钟或几小时)。我怎么能在R
中做到这一点答案 0 :(得分:3)
我总是非常不愿意手工解析日期和时间,我相信自己的代码远远少于构建专用工具的其他人的测试工作。
所以我会使用lubridate
例如:
library(lubridate)
data <-
c("9.58", "19.19", "43.03", "1:40.91", "2:11.96", "3:26.00",
"3:43.13", "4:44.79", "7:20.67", "12:37.35", "26:17.53", "26:44")
difftime(parse_date_time(data, orders = c("%H %M %OS", "%M %OS", "%OS")),
parse_date_time("0", orders = "%S"))
# Time differences in secs
# [1] 9.580002 19.190002 43.029999 100.910004 131.959999
# [6] 206.000000 223.129997 284.790001 440.669998 757.349998
# [11] 1577.529999 1604.000000
lubridate
提供了提供连续尝试的多种解析格式的有利可能性(c("%H:%M:%OS", "%M:%OS", "%OS")
,同时请注意:
分隔符可以省略,允许更强大的解析格式不正确的输入数据)
我的解决方案仍然有点“hacky”,因为我无法直接将其解析为difftime
,而是POSIXct
,因此我将它们与0
进行比较,以输出difftime
}秒。
答案 1 :(得分:1)
您可以在冒号分隔符str_split
上使用:
拆分字符串,并将其转换为秒。
have <- c("9.58","1:40.91","1:01:02.1")
have_split <- strsplit(have,":") ## List of times split
convert <- function(x){
x <- as.numeric(x)
if(length(x) == 1){ ## Has only seconds
x
} else if(length(x) == 2){ ## Has seconds and minutes
out <- x[1]*60+x[2]
} else if(length(x) == 3){ ## Has seconds, minutes and hours
out <- x[1]*60^2+x[2]*60+x[3]
}
}
sapply(have_split,convert)
## [1] 9.58 100.91 3662.10
答案 2 :(得分:1)
使用sub
data1 <- sub("^([^:]+:[^:]+)$", "00:\\1", sub("^([0-9]*\\.*[0-9]*)$", "00:00:\\1", data))
1)使用chron
- 转换&#39; data1&#39;到times
对象,强制转换为numeric
并在一天内乘以秒,即86400
library(chron)
60*60*24*as.numeric(times(data1))
#[1] 9.58 19.19 43.03 100.91 131.96 206.00
#[7] 223.13 284.79 440.67 757.35 1577.53 1604.00
2)使用period_to_seconds
中的lubridate
- 转换为datetime对象,然后使用period_to_seconds
library(lubridate)
period_to_seconds(hms(data1))
#[1] 9.58 19.19 43.03 100.91 131.96 206.00
#[7] 223.13 284.79 440.67 757.35 1577.53 1604.00