将时间字符串转换为上午/下午和24小时格式(R)

mqkwyuun  于 2023-02-26  发布在  其他
关注(0)|答案(3)|浏览(253)

我在df列中有一个时间列表,如下所示:

times <- c("11:30am", "3:15pm", "2:25pm", "12:05pm", "8:25pm", "7:52pm", "13:22", "18:45", "21:14", "11:20")

如何将时间转换为时间格式,以便它们都正确格式化?
我想上午/下午将从那些有它和转换为24小时时间,并为那些已经在正确的格式,将转换为时间格式删除。

11:30
15:15
14:25
12:05
20:25
19:52
13:22
18:45
21:14
11:20

我试过:

times <- ifelse(grepl('am', times) | grepl('pm', times),
                  as.POSIXct(times, format = "%I:%M%p"), as.POSIXct(times,format="%H:%M"))

但它只给了我一串号码。

tjvv9vkg

tjvv9vkg1#

可以使用正则表达式检测输入值的格式。
然后根据小时输入格式调整strptime的参数。

ifelse(grepl("am|pm", times),
       format(strptime(times, "%I:%M %p"), format="%H:%M"),
       format(strptime(times, "%H:%M"), format="%H:%M"))
[1] "11:30" "15:15" "14:25" "12:05" "20:25" "19:52" "13:22" "18:45" "21:14" "11:20"
e5nqia27

e5nqia272#

您可以:

sapply(strsplit(times, ":"), function(x) {
  h <- as.numeric(x[1]) + grepl("pm", x[2]) * 12
  if(h == 24) h <- 12
  if(h == 12 & grepl("am|pm", x[2])) h <- 0
  paste(sprintf("%02d", h), 
        gsub("^(\\d+).*$", "\\1", x[2]), sep = ":")
})
#>  [1] "11:30" "15:15" "14:25" "00:05"  "20:25" "19:52" "13:22" "18:45"
#>  [9] "21:14" "11:20"
pkmbmrz7

pkmbmrz73#

使用parse_date

library(parsedate)
format(parse_date(times), "%H:%M")
  • 输出
[1] "11:30" "15:15" "14:25" "12:05" "20:25" "19:52" "13:22" "18:45" "21:14" "11:20"

相关问题