【问题标题】:Combine hour and minutes columns in one column and get the time difference in R将小时和分钟列合并在一列中并获得 R 中的时差
【发布时间】:2020-04-16 14:17:56
【问题描述】:

尊敬的 R 社区成员, 我有一个 12 小时格式的数据集,设计如下:

departurehour   departureminute  arrivalhour   arrivalminute 
4                30               4             50    
9                10               9             30
8                10               8             18

我想得到以下通勤时间的输出(以分钟格式)。通勤时间=到达时间-出发时间。

Departuretime   Arrivaltime     Commutetime 
4:30            4:50               20 
9:10            9:30               20
8:10            8:18                8  

非常感谢您的及时帮助。 非常感谢您提前。

【问题讨论】:

    标签: r lubridate


    【解决方案1】:

    我们可以结合departurehourdepartureminute 得到departuretime 并为arrivaltime 做同样的事情。使用difftimearrivaltimedeparturetime 中减去值,得到以分钟为单位的时差。

    library(dplyr)
    library(tidyr)
    
    df %>%
      unite(departuretime, departurehour, departureminute, sep = ":") %>%
      unite(arrivaltime, arrivalhour, arrivalminute, sep = ":") %>%
      mutate(Commutetime = as.numeric(difftime(
              as.POSIXct(sprintf("%04s", arrivaltime), format = "%H:%M"), 
              as.POSIXct(sprintf("%04s", departuretime), format = "%H:%M"), 
              units = "mins")))
    
    #  departuretime arrivaltime Commutetime
    #1          4:30        4:50          20
    #2          9:10        9:30          20
    #3          8:10        8:18           8
    

    【讨论】:

      【解决方案2】:

      dplyr:

       df %>% 
        mutate(ArrivalTime = paste0(arrivalhour,":",arrivalminute),
                DepartTime = paste0(departurehour,":",departureminute)) %>% 
         select(ends_with("Time")) %>% 
         mutate(DepartTime = strptime(DepartTime, format="%H:%M"),
               ArrivalTime = strptime(ArrivalTime, format="%H:%M"),
                Total =difftime(ArrivalTime, DepartTime)) 
                ArrivalTime          DepartTime   Total
      1 2020-04-16 04:50:00 2020-04-16 04:30:00 20 mins
      2 2020-04-16 09:30:00 2020-04-16 09:10:00 20 mins
      3 2020-04-16 08:18:00 2020-04-16 08:10:00  8 mins
      

      注意 这需要一些日期组件才能使difftime 工作。

      数据

      df <- structure(list(departurehour = c(4L, 9L, 8L), departureminute = c(30L, 
      10L, 10L), arrivalhour = c(4L, 9L, 8L), arrivalminute = c(50L, 
      30L, 18L)), class = "data.frame", row.names = c(NA, -3L))
      

      【讨论】:

        【解决方案3】:

        这是data.table的选项

        library(data.table)
        setDT(df1)[, .(departuretime = sprintf("%02d:%02d", departurehour,
            departureminute), arrivaltime = sprintf("%02d:%02d", arrivalhour,
               arrivalminute))][, CommuteTime := 
               as.numeric(as.ITime(arrivaltime) - as.ITime(departuretime))/60][]
        #   departuretime arrivaltime CommuteTime
        #1:         04:30       04:50          20
        #2:         09:10       09:30          20
        #3:         08:10       08:18           8
        

        数据

        df1 <- structure(list(departurehour = c(4L, 9L, 8L), departureminute = c(30L, 
        10L, 10L), arrivalhour = c(4L, 9L, 8L), arrivalminute = c(50L, 
        30L, 18L)), class = "data.frame", row.names = c(NA, -3L))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-17
          • 2013-11-24
          • 1970-01-01
          • 2019-07-03
          • 2021-12-19
          相关资源
          最近更新 更多