如何在R中24:00:00转换时间

时间:2016-09-01 09:45:27

标签: r

在R中我有这个data.frame

24:43:30 23:16:02 14:05:44 11:44:30 ...

请注意,有些时候超过 24:00:00!事实上,我的所有时间都在02:00:0025:59:59之内。

我想在2小时内减去数据集data中的所有条目。这样我就可以获得常规数据集。我怎么能这样做?

我试过这个

strptime(data, format="%H:%M:%S") - 2*60*60

这适用于23:59:59以下的所有条目。对于上述所有条目,我只需获得NA,因为strptime命令会生成NA以上23:59:59以上的所有条目。

2 个答案:

答案 0 :(得分:4)

使用lubridate包可以让工作更轻松!

> library(lubridate)
> t <- '24:43:30'
> hms(t) - hms('2:0:0')
[1] "22H 43M 30S"

更新:

将日期转换回文字!

> substr(strptime(hms(t) - hms('2:0:0'),format='%HH %MM %SS'),12,20)
[1] "22:43:30"

添加@RHertel的更新:

format(strptime(hms(t) - hms('2:0:0'),format='%HH %MM %SS'),format='%H:%M:%S')

更好地形成lubridate对象的方法:

s <- hms('02:23:58) - hms('2:0:0')
paste(hour(s),minute(s),second(s),sep=":")
"0:23:58"

答案 1 :(得分:3)

尽管@amrrs的答案解决了主要问题,但格式化可能仍然存在问题,因为hms()无法提供统一的输出。最好用一个例子显示:

library(lubridate)
hms("01:23:45")
#[1] "1H 23M 45S"
hms("00:23:45")
#[1] "23M 45S"
hms("00:00:45")
#[1] "45S"

根据传递给hms()的时间,输出可能包含也可能不包含小时和分钟的条目。此外,以小时,分钟和秒的单位数值省略前导零。如果试图将数据放入常见形式,这可能会导致格式化噩梦。

要解决此问题,可以先将时间转换为具有lubridate as.duration()功能的持续时间。然后,可以将持续时间(以秒为单位)转换为POSIXct对象,使用format()可以轻松提取小时,分钟和秒:

times <- c("24:43:30", "23:16:02", "14:05:44", "11:44:30", "02:00:12")
shifted_times <- hms(times) - hms("02:00:00")
format(.POSIXct(as.duration(shifted_times),tz="GMT"), "%H:%M:%S")
#[1] "22:43:30" "21:16:02" "12:05:44" "09:44:30" "00:00:12"

如果将shifted_times传递给strptime(),则最后一个条目“02:00:12”会造成困难。