【问题标题】:calculate time difference in the same group计算同一组的时间差
【发布时间】:2021-04-12 17:30:35
【问题描述】:

我想将time 列转换为时间十进制格式,然后在user_id 的每组中找到时间间隔。我已经尝试了下面的答案,但我无法让它工作:

Days difference between two dates in same column in R

structure(list(question_id = c(5502L, 5502L, 5502L, 5502L, 5502L
), user_id = c(112197L, 112197L, 112197L, 114033L, 114033L), 
    time = structure(c(1603720173, 1603720388, 1603720702, 1603603115, 
    1603949442), class = c("POSIXct", "POSIXt"), tzone = ""), 
    prediction = c(0.9, 0.95, 0.9, 0.99, 0.94), log_score = c(0.84799690655495, 
    0.925999418556223, 0.84799690655495, 0.985500430304885, 0.910732661902913
    )), row.names = 156182:156186, class = "data.frame")

【问题讨论】:

    标签: r lubridate


    【解决方案1】:

    也许这就是你要找的东西?

    library(dplyr)
    user_data %>%
       group_by(user_id) %>%
       summarise(day.interval = difftime(max(time), min(time),units = "days"))
    # A tibble: 2 x 2
      user_id day.interval    
        <int> <drtn>          
    1  112197 0.006122685 days
    2  114033 4.008414352 days
    

    【讨论】:

      【解决方案2】:
      library(tidyverse)
      library(lubridate)
      
      df <- tibble::tribble(
        ~question_id, ~user_id, ~time, ~prediction, ~log_score,
        5502L,  112197L, "2020-10-26 14:49:33",         0.9,  0.84799690655495,
        5502L,  112197L, "2020-10-26 14:53:08",        0.95, 0.925999418556223,
        5502L,  112197L, "2020-10-26 14:58:22",         0.9,  0.84799690655495,
        5502L,  114033L, "2020-10-25 06:18:35",        0.99, 0.985500430304885,
        5502L,  114033L, "2020-10-29 06:30:42",        0.94, 0.910732661902913
      )
      
      df %>%
        as_tibble() %>%
        mutate(time = lubridate::ymd_hms(time)) %>%
        group_by(user_id) %>%
        mutate(diff = time - lag(time),
               diff2 = hms::hms(seconds_to_period(diff)))
      #> # A tibble: 5 x 7
      #> # Groups:   user_id [2]
      #>   question_id user_id time                prediction log_score diff        diff2   
      #>         <int>   <int> <dttm>                   <dbl>     <dbl> <drtn>      <time>  
      #> 1        5502  112197 2020-10-26 14:49:33       0.9      0.848     NA secs       NA
      #> 2        5502  112197 2020-10-26 14:53:08       0.95     0.926    215 secs 00:03:35
      #> 3        5502  112197 2020-10-26 14:58:22       0.9      0.848    314 secs 00:05:14
      #> 4        5502  114033 2020-10-25 06:18:35       0.99     0.986     NA secs       NA
      #> 5        5502  114033 2020-10-29 06:30:42       0.94     0.911 346327 secs 96:12:07
      

      【讨论】:

      • 嗯,这是对作者想要的问题的一个很好的替代解释。希望他们能让我们知道他们最终想要什么。
      • 如果我可以先将每个时间转换为时间小数,然后找到每次之间的时间间隔,我认为这段代码将帮助我找到正确的时间间隔。例如,如果“2020-10-26 14:49:33”,则时间小数将为 1.200833333,第二次“2020-10-26 14:53:08”将为 1.260555556。所以间隔将是 0.05972222222。我怎样才能正确地做到这一点?
      • 如果要将持续时间表示为小时的小数部分,可以转换diff 列:diff3 = as.numeric(diff / 3600)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 2019-03-18
      • 2017-07-13
      • 2020-02-14
      相关资源
      最近更新 更多