将小时分钟重新编码为半小时



我有一个时间向量作为字符串:

time_hour <- c("0000", "0723", "0750", "0751", "1229", "1230")

第一个时间点是晚上12:00,最后一个是下午12:30。我想将此矢量重新编码为半小时的类别,例如:

recoded_time <- c("2330-0000", "0700-0730", "0730-0800", "0730-0800", "1200-1230", "1200-1230")

如果时间降落在确切的半小时切点中,则将其重新编码为上一个类别,如上述示例的第一个和最后一个重述。

任何想法如何完成?

library(purrr)
library(dplyr)
time_hour <- c("0000", "0723", "0750", "0751", "1229", "1230")

迭代一小时&amp;分钟,使用dplyrcase_when处理标准和边缘案例&amp;将计算值与单个sprintf's结合在一起:

map2_chr(
  as.numeric(substr(time_hour, 1, 2)),
  substr(time_hour, 3, 4), 
  ~case_when(
    ((.x == 0) & (.y == "00")) ~ "2330-0000",
         (as.numeric(.y) > 30) ~ sprintf("%02d30-%02d00", .x, (.x+1)),
                          TRUE ~ sprintf("%02d00-%02d30", .x, .x)
  )
)

这是我使用lubriate的解决方案。

library(lubridate)
time_hour <- c("0000", "0723", "0750", "0751", "1229", "1230")
time_hour <- strptime(time_hour,format="%H%M")-1
paste(sprintf('%02d', hour(time_hour)), 
  sprintf('%02d', floor(minute(time_hour)/30)*30), 
  '-',
  sprintf('%02d', hour(time_hour + 1800)),
  sprintf('%02d', floor(minute(time_hour+1800)/30)*30),
  sep='')

输出是:

"2330-0000" "0700-0730" "0730-0800" "0730-0800" "1200-1230" "1200-1230"
time_hour <- c("0000", "0723", "0750", "0751", "1229", "1230")
for(t in time_hour){
  hour <- as.numeric(substr(t,1,2))
  min <- substr(t,3,4)
  if(hour == 0 & min == "00"){
    out <- "2330-0000"
  }else if(as.numeric(min) > 30){
    out <- paste(sprintf("%02d",hour),"30", "-", sprintf("%02d",(hour+1)), "00", sep = "")
  }else{
    out <- paste(sprintf("%02d",hour),"00", "-", sprintf("%02d",(hour)), "30", sep = "")
  }
  print(out)
}
[1] "2330-0000"
[1] "0700-0730"
[1] "0730-0800"
[1] "0730-0800"
[1] "1200-1230"
[1] "1200-1230"

最新更新