将字符串转换为时间的R代码

3
我想将一个字符串转换为时间。我有一个时间字段,这个字符串只有四个数字和一个字母(A或P),没有冒号来显示它是一个时间。我想将这个字符串转换为24小时制的时间,以便我可以去掉A和P。
以下是示例:
time = c("1110A", "1120P", "0420P", "0245P")

我正在寻找一个类似于这样的时间类:
Answer= c('11:10', '23:20', '16:20', '14:45')

非常感谢您的帮助。


你想要它成为一个实际的“日期”类还是一个字符?如果你想要它成为一个“日期”,你还需要一个月/年标识符。 - Mike H.
最后一个不应该是“14:45”而不是“2:45”吗? - Mike H.
我想要能够对两个时间进行减法运算。如果可以用日期类实现那就太好了。我知道我在答案变量中展示了字符。但是一旦达到那个点,我很容易进行转换。 - Tracy
这个向量的最后一项似乎不符合该描述,因为它带有一个冒号。这是有意为之吗? - camille
3个回答

5
您可以使用函数strptime从字符串中创建日期,只需对字符串进行一些小的更改即可。
time <- c("1110A", "1120P", "0420P", "02:45P")
time <- gsub(":", "", time)
time <- strptime(x = paste0(time, "m"), format = "%I%M%p")

paste 是为了让 strptime 能解析我们提供的格式而必需的。其中 %I 代表小时数 (00-24),%M 代表分钟数,%p 用于解析 AM/PM。

一旦将其解析为日期,你可以使用格式进行美观打印,或者像使用 +-diff 等普通操作符一样使用它......

strptime 在解析日期时提供了很大的灵活性,但有时在日期不符合标准格式时,需要尝试几个方法。


1
%I 是十进制小时(01-12) - Mike H.

2
我们也可以使用`lubridate`函数来解析`paste`日期后的格式。
library(lubridate)
library(glue)
ymd_hm(glue("2018-01-01 {time}M"))
#[1] "2018-01-01 11:10:00 UTC" "2018-01-01 23:20:00 UTC"
#[3] "2018-01-01 16:20:00 UTC" "2018-01-01 14:45:00 UTC"

1
在你的问题中,你说你想要能够减去这些时间。我认为将其转换为POSIXct对象是最有意义的。如果你想要一个特定的day/month/year,你需要像下面这样附加到你的字符串中,否则你不能指定一个日期,它会假设日期是今天:
date2 = as.POSIXct(paste0("01-01-2018 ", time, "m"), format = "%m-%d-%Y %I%M%p")

date2
#[1] "2018-01-01 11:10:00 EST" "2018-01-01 23:20:00 EST" "2018-01-01 16:20:00 EST" "2018-01-01 14:45:00 EST"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接