【问题标题】:Convert time object to categorical (morning, afternoon, evening, night) variable in R?将时间对象转换为R中的分类(早上,下午,晚上,晚上)变量?
【发布时间】:2018-03-19 18:52:51
【问题描述】:

我在时间数据框中有这个向量,格式为小时:分钟,我想转换为一天中的分类时间:

    time <- c("15:03", "08:01", "11:59", "23:47", "14:20")
    df$time <- format(strptime(df$time, tz = "" , format = "%H: %M"), format = "%H: %M")
    df <- data.frame(time)

我想我会考虑早上 5 点到 11 点,下午 11 点到 16 点,晚上 16 点到 19 点,以及其他任何时间,直到晚上 5 点。原始数据的时间格式为带 strptime() 的小时:分钟。

我在论坛上发现了一些类似的问题,但我似乎无法调整代码来处理我的数据。

【问题讨论】:

    标签: r time


    【解决方案1】:
    time <- as.POSIXct(strptime(c("15:03", "08:01", "11:59", "23:47", "14:20"),"%H:%M"),"UTC")
    
    x=as.POSIXct(strptime(c("050000","105959","110000","155959","160000",
                            "185959"),"%H%M%S"),"UTC")
    library(tidyverse)
    case_when(
    between(time,x[1],x[2]) ~"morning",
    between(time,x[3],x[4]) ~"afternoon",
    between(time,x[5],x[6]) ~"evening",
    TRUE ~"night")
    [1] "afternoon" "morning"   "afternoon" "night"     "afternoon"
    

    使用基础 R:

    time <- as.POSIXct(strptime(c("15:03", "08:01", "11:59", "23:47", "14:20"),"%H:%M"),"UTC")
    
    x=as.POSIXct(strptime(c("000000","050000","110000","160000","190000","235959"),
                          "%H%M%S"),"UTC")
    labs=c("night","morning","afternoon","evening","night")
    labs[findInterval(time,x)]
    [1] "afternoon" "morning"   "afternoon" "night"     "afternoon"
    

    【讨论】:

      【解决方案2】:

      我认为这可以完成,我不确定如何接受重复标签,但也许其他人会。关键是使用chron::times() 创建一个按时间顺序排列的对象,而不是一个日期时间对象。

      time <- c("15:03", "08:01", "11:59", "23:47", "14:20")
      timep <- as.POSIXct(time, format = "%H:%M") %>% format("%H:%M:%S")
      cut(chron::times(timep) , breaks = (1/24) * c(0,5,11,16,19,24), 
          labels = c("night", "morning", "afternoon", "evening", "night1"))
      
      # [1] afternoon morning   afternoon night1    afternoon
      # Levels: night morning afternoon evening night1
      

      更新:

      tod <- cut(chron::times(timep) , breaks = (1/24) * c(0,5,11,16,19,24))
      c("night","morning","afternoon","evening","night")[as.numeric(tod)]
      # "afternoon" "morning"   "afternoon" "night"     "afternoon"
      

      【讨论】:

        【解决方案3】:

        使用一些regexifelse

        df$hour <- as.numeric(gsub("\\:.*$", "", df$time))
        df$cat <- with(df,  ifelse(hour >= 5 & hour<=11, "morning",
                                    ifelse(hour>11 & hour<=16, "evening", "night")))
        df
           time hour     cat
        1 15:03   15 evening
        2 08:01    8 morning
        3 11:59   11 morning
        4 23:47   23   night
        5 14:20   14 evening
        

        【讨论】:

          【解决方案4】:

          这个和@Onyambu类似,只是用了plyrmapvalues()lubridatehour()

          library(lubridate)
          library(plyr)
          df$timeofdat<-   mapvalues(hour(df$time),from=c(0:23),
            to=c(rep("night",times=5), rep("morning",times=6),rep("afternoon",times=5),rep("night", times=8)))
          

          【讨论】:

            【解决方案5】:

            我能够使用ifelse 语句来创建类别。我将strptime 更改为as.POSIXct,并且只保留了制作组的时间。在 df 中有 3 列代表原始时间,只有小时,然后是组。如果类别需要成为一个因素,您可以使用as.factor 将其更改为一个因素。

            time <- c("15:03", "08:01", "11:59", "23:47", "14:20")
            
            time2 <- format(as.POSIXct(time, tz = "" , format = "%H: %M"), "%H")
            
            df <- data.frame(time, time2 = as.numeric(time2))
            
            df$time_category <- ifelse(df$time2 >= 05 & df$time2 <= 11, "Morning",
                        ifelse(df$time2 > 11 & df$time2 <= 16, "Afternoon",
                        ifelse(df$time2 > 16 & df$time2 <= 19, "Evening", "Night")))
            

            【讨论】:

              猜你喜欢
              • 2019-08-29
              • 1970-01-01
              • 2018-10-22
              • 2015-02-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多