我有一个时间超过24小时的数据集。如何将这些时间转换为AM / PM,然后从最早到最晚订购?
例如25:55 = 1:55 AM(第二天)
2:00 AM> 1:55 AM(第二天)
答案 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,但是我认为这是这样的。