如何在R中将25小时制转换为AM / PM?

时间:2018-07-06 18:28:07

标签: r time

我有一个时间超过24小时的数据集。如何将这些时间转换为AM / PM,然后从最早到最晚订购?

例如25:55 = 1:55 AM(第二天)

2:00 AM> 1:55 AM(第二天)

3 个答案:

答案 0 :(得分:2)

如果您确实有矢量,我会将其矢量化。

vec <- c("23:02", "24:55", "25:55", "77:33")  # 77 = 24+24+24+5 *shrug*
lapply(strsplit(vec, ":"), function(tm) {
  a <- sum(as.integer(tm) / c(1,60)) %% 24
  sprintf("%d:%02d", as.integer(a), as.integer((a %% 1)*60))
})
# [[1]]
# [1] "23:02"
# [[2]]
# [1] "0:55"
# [[3]]
# [1] "1:55"
# [[4]]
# [1] "5:32"

如果您想要小时中的前导零(例如"01:55"),请将%d更改为%02d

修改

更加简单,因为我们不需要对分钟进行任何更改:

lapply(strsplit(vec, ":"), function(tm) sprintf("%d:%s", as.integer(tm[1]) %% 24, tm[2]))
# [[1]]
# [1] "23:02"
# [[2]]
# [1] "0:55"
# [[3]]
# [1] "1:55"
# [[4]]
# [1] "5:33"

答案 1 :(得分:1)

您可以使用库gsubfn

library(gsubfn)
vec <- c("23:02", "24:55", "25:55", "77:33")

gsubfn("(\\d+):",~sprintf("%02d:",as.numeric(x)%%24),vec)

[1] "23:02" "00:55" "01:55" "05:33"

在base R中,您可以执行以下操作:

s=vec

a=regmatches(s,regexpr("\\d+",s))

regmatches(s,regexpr("\\d+",s))=sprintf("%02d",as.numeric(a)%%24)
s
[1] "23:02" "00:55" "01:55" "05:33"

或者如果您不想复制:

`regmatches<-`(vec,regexpr("\\d+",s),value=sprintf("%02d",as.numeric(sub(":.*","",vec))%%24))
[1] "23:02" "00:55" "01:55" "05:33"

答案 2 :(得分:0)

到目前为止,给出的答案似乎还不能完全满足12小时的工作时间。

vec <- c("23:02", "24:55", "25:55", "77:33", "39:56", "08:23", "13:48")
hr <- as.numeric(gsub(":[0-9]{2}", "", vec))

d <- hr %/% 24
h <- hr %% 12
m <- as.numeric(gsub("[0-9]{2}:", "", vec))
p <- c("AM", "PM")[(hr %% 24 > 12) + 1]

times <- data.frame(original=vec, day=d, hour=h, minutes=m, period=p)

times[with(times, order(day, period, hour, minutes)), ]

#   original day hour minutes period
# 6    08:23   0    8      23     AM
# 7    13:48   0    1      48     PM
# 1    23:02   0   11       2     PM
# 2    24:55   1    0      55     AM
# 3    25:55   1    1      55     AM
# 5    39:56   1    3      56     PM
# 4    77:33   3    5      33     AM

我不习惯使用AM / PM,但是我认为这是这样的。