将小时 - 分钟重新编码为半小时类别

时间:2017-09-29 09:42:46

标签: r

我的时间向量是这样的字符串:

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")

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

知道怎么做到这一点吗?

3 个答案:

答案 0 :(得分:3)

library(purrr)
library(dplyr)

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

迭代分裂时间&amp;分钟,使用dplyr的{​​{1}}来处理标准和边缘情况&amp;将计算值与单case_when的组合:

sprintf

答案 1 :(得分:1)

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

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"

答案 2 :(得分:0)

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"