我有这样的数据
y<-c("00:00:10", "00:10:10", "2:10:2")
这些数据采用H:M:S格式。我希望能够将此数据转换为总秒数。我喜欢将H数据与H * 60 * 60 + M * 60 + S相乘以计算总秒数值。
我这样做:
z <- strptime(, "%H")
获取小时值,不起作用。任何人都可以插话吗?
答案 0 :(得分:4)
我从未使用过复杂的包装处理时间。这是一个代替它的oneliner。
> apply(sweep(sapply(strsplit(y, ":"), as.integer), 1, 60^(2:0), "*"), 2, sum)
[1] 10 610 7802
答案 1 :(得分:3)
你的小时数可以超过24小时吗?如果是这样,我认为你必须将它们视为字符串。同样在您的示例中,最后2
在第三次2:10:2
中的含义是什么?是两秒钟还是二十秒?
我使用这两个函数来回转换:
convertSecToHrMinSec <- function(vec) {
# takes a vector of seconds
# returns string formatted as HHH:MM:SS
vec <- as.integer(vec)
hr <- floor(vec / 3600)
min <- floor((vec - hr * 3600) / 60)
sec <- vec - min * 60 - hr * 3600
hr <- sprintf('%02d', hr)
min <- sprintf('%02d', min)
sec <- sprintf('%02d', sec)
return (paste(hr, min, sec, sep=':'))
}
convertHrMinSecToSec <- function(vec) {
## convert hrs:mins:seconds to seconds
require(stringr)
require(plyr)
if (length(grep('.+/.+:.+', vec, perl=TRUE)) >= 1) return(vec)
if (length(grep('.+:.+:.+', vec, perl=TRUE)) >= 1) {
vec <- laply(str_split(vec, ':'), function(x) as.integer(x[1]) * 3600 + as.integer(x[2]) * 60 + as.integer(x[3]))
}
return (vec)
}
根据Carl的上述评论,使用lubridate
:
library(lubridate)
hms(y)
[1] 10 seconds 10 minutes and 10 seconds 2 hours, 10 minutes and 2 seconds
好的衡量标准:
> str(hms(y))
Formal class 'Period' [package "lubridate"] with 6 slots
..@ .Data : num [1:3] 10 10 2
..@ year : num [1:3] 0 0 0
..@ month : num [1:3] 0 0 0
..@ day : num [1:3] 0 0 0
..@ hour : num [1:3] 0 0 2
..@ minute: num [1:3] 0 10 10
>
Hadley在period
中创建的lubridate
类型非常令人愉快,但需要稍微习惯。
答案 2 :(得分:3)
我参加派对有点晚了,但我认为这是一个很好的方法,因为它使用标准的时间函数而且很简单:
as.integer(as.POSIXct(y,format="%H:%M:%S",tz="GMT")) %% (60*60*24)
[1] 10 610 7802
注意:仅当您的数据是时钟时间时才适用。