将格式Hh Mm Ss的因子转换为持续时间

时间:2015-01-30 21:09:49

标签: r datetime

我正在使用一个数据框,该数据框的变量名为"持续时间"使用以下格式的值:

1h 7m 46s

0h 16m 41s

..等等。该列被格式化为"因子"默认情况下,我想知道如何将其转换为实际持续时间。我希望能够计算持续时间的平均值和总和。

2 个答案:

答案 0 :(得分:5)

您可以按如下方式提取小时,分钟和秒:

x <- c('1h 7m 46s','0h 16m 41s')
hours <- as.numeric(gsub('^(?:.* )?([0-9]+)h.*$','\\1',x))
minutes <- as.numeric(gsub('^.* ([0-9]+)m.*$','\\1',x))
seconds <- as.numeric(gsub('^.* ([0-9]+)s.*$','\\1',x))
duration_seconds <- seconds + 60*minutes + 60*60*hours

分钟的模式转换为:以(^)个零(或*)个字符(.)开头,后跟空格() ,后跟一个或多个(+)个数字([0-9]),后跟字母m(m),后跟零个或多个(*)个字符({{1 }}到字符串的末尾(.

奖励:正则表达式中的$小时为非捕获组((?:.* )?),消耗零个或多个((?: ))图表(*)后跟一个空格(.)。请注意,因为是非捕获gruop。 (?:.* )?仍然引用数字字符串。

答案 1 :(得分:4)

考虑将时间转换为as.character()强制转换的字符串。一旦您的时间是字符串,您可以使用DateTime命令将它们转换为strptime个对象,例如

> s <- "1h 7m 46s"
> tfmt <- "%Hh %Mm %Ss"
> t1 <- strptime(s, format=tfmt)
> s <- "0h 16m 41s"
> t2 <- strptime(s, format=tfmt)

使用这种格式的数据非常方便,因为有工具可以使用它们

> t1
[1] "2015-01-30 01:07:46"
> t2
[1] "2015-01-30 00:16:41"
> t1 - t2
Time difference of 51.08333 mins
> difftime(t1, t2, units="secs")
Time difference of 3065 secs