【问题标题】:calculate the time difference. R计算时间差。 R
【发布时间】:2021-09-08 12:48:03
【问题描述】:

我有一个包含 2 列的数据框:

   StartTime             EndTime
1. 2019-05-06 08:34:15   2019-05-06 08:48:30
2. 2019-05-06 10:07:18   2019-05-06 10:21:34
3. 2019-05-06 15:13:10   2019-05-06 15:27:26
4. 2019-05-06 15:35:52   2019-05-06 15:50:07
5. 2019-05-06 16:14:18   2019-05-06 16:33:58
6. 2019-05-06 16:58:14   2019-05-06 17:13:36
7. 2019-05-06 20:28:50   2019-05-06 21:05:11
8. 2019-05-06 21:55:53   2019-05-06 22:16:50
9. 2019-05-06 22:42:21   2019-05-06 22:57:46
10.2019-05-06 23:26:59   2019-05-07 00:03:46
11.2019-05-07 00:36:43   2019-05-07 00:53:44

我想添加一个新列(IdlingTime)来计算空闲时间。 假设第一行 IdleTime 是: StartTime 的第 2 行 - EndTime 的第 1 行 = 1 HR 18 min 48 sec 并转换为分钟。

谢谢你。

【问题讨论】:

    标签: r datetime difftime


    【解决方案1】:

    这就是我的做法。

    df %>%
      mutate_all(dmy_hm)  %>%
      mutate(
        IdlingTime = as.double(lead(StartTime)-EndTime, units = "mins")
      )
    

    【讨论】:

      【解决方案2】:

      更新如果你的数据已经是POSIXct:那么

      library(dplyr)
      df %>%
        mutate(IdlingTime = round(lead(StartTime)-EndTime))
      

      输出:

        StartTime           EndTime             IdlingTime
         <dttm>              <dttm>              <drtn>    
       1 2019-05-06 08:34:15 2019-05-06 08:48:30  79 mins  
       2 2019-05-06 10:07:18 2019-05-06 10:21:34 292 mins  
       3 2019-05-06 15:13:10 2019-05-06 15:27:26   8 mins  
       4 2019-05-06 15:35:52 2019-05-06 15:50:07  24 mins  
       5 2019-05-06 16:14:18 2019-05-06 16:33:58  24 mins  
       6 2019-05-06 16:58:14 2019-05-06 17:13:36 195 mins  
       7 2019-05-06 20:28:50 2019-05-06 21:05:11  51 mins  
       8 2019-05-06 21:55:53 2019-05-06 22:16:50  26 mins  
       9 2019-05-06 22:42:21 2019-05-06 22:57:46  29 mins  
      10 2019-05-06 23:26:59 2019-05-07 00:03:46  33 mins  
      11 2019-05-07 00:36:43 2019-05-07 00:53:44  NA mins  
      

      第一个答案: 在获得正确的类datetime 后,我们可以使用dplyr 包中的lead 函数:

      库(dplyr) 图书馆(润滑)

      df %>% 
       #mutate(across(contains("Time"), ~ymd_hms(.))) 
               IdlingTime = lead(StartTime)-EndTime)
      

      输出:

         StartTime           EndTime             IdlingTime     
         <dttm>              <dttm>              <drtn>         
       1 2019-05-06 08:34:15 2019-05-06 08:48:30  78.800000 mins
       2 2019-05-06 10:07:18 2019-05-06 10:21:34 291.600000 mins
       3 2019-05-06 15:13:10 2019-05-06 15:27:26   8.433333 mins
       4 2019-05-06 15:35:52 2019-05-06 15:50:07  24.183333 mins
       5 2019-05-06 16:14:18 2019-05-06 16:33:58  24.266667 mins
       6 2019-05-06 16:58:14 2019-05-06 17:13:36 195.233333 mins
       7 2019-05-06 20:28:50 2019-05-06 21:05:11  50.700000 mins
       8 2019-05-06 21:55:53 2019-05-06 22:16:50  25.516667 mins
       9 2019-05-06 22:42:21 2019-05-06 22:57:46  29.216667 mins
      10 2019-05-06 23:26:59 2019-05-07 00:03:46  32.950000 mins
      11 2019-05-07 00:36:43 2019-05-07 00:53:44         NA mins
      

      【讨论】:

      • 警告信息:mutate() 输入问题..1。 ℹ..1 = across(contains("Time"), ~ymd_hms(.))。 ℹ 所有格式解析失败。未找到格式。 ...与您的代码一起添加的 idlingTime 列。但是收到此警告消息。这仍然有效吗?
      • 我的 StartTime 和 EndTime 列是 POSIXct,格式。
      【解决方案3】:

      你只需减去列。

      这是给出更新问题的(可重现,使用您的数据!!)代码。我使用data.table,它在读取时将数据列解析为 POSIXct,并且也很容易实现超前/滞后

      代码

      library(data.table)
      data <- fread(text="StartTime,EndTime
      2019-05-06 08:34:15,2019-05-06 08:48:30
      2019-05-06 10:07:18,2019-05-06 10:21:34
      2019-05-06 15:13:10,2019-05-06 15:27:26
      2019-05-06 15:35:52,2019-05-06 15:50:07
      2019-05-06 16:14:18,2019-05-06 16:33:58
      2019-05-06 16:58:14,2019-05-06 17:13:36
      2019-05-06 20:28:50,2019-05-06 21:05:11
      2019-05-06 21:55:53,2019-05-06 22:16:50
      2019-05-06 22:42:21,2019-05-06 22:57:46
      2019-05-06 23:26:59,2019-05-07 00:03:46
      2019-05-07 00:36:43,2019-05-07 00:53:44")
      
      data[, minElapsed := as.numeric(EndTime - StartTime)]
      data[, idleMin := as.numeric(StartTime - shift(EndTime))]
      data
      

      输出

      > library(data.table)
      > data <- fread(text="StartTime,EndTime
      + 2019-05-06 08:34:15,2019-05-06 08:48:30
      + 2019-05-06 10:07:18,2019-05-06 10:21:34
      + 2019-05-06 15:13:10,2019-05-06 15:27:26
      + 2019-05-06 15:35:52,2019-05-06 15:50:07
      + 2019-05-06 16:14:18,2019-05-06 16:33:58
      + 2019-05-06 16:58:14,2019-05-06 17:13:36
      + 2019-05-06 20:28:50,2019-05-06 21:05:11
      + 2019-05-06 21:55:53,2019-05-06 22:16:50
      + 2019-05-06 22:42:21,2019-05-06 22:57:46
      + 2019-05-06 23:26:59,2019-05-07 00:03:46
      + 2019-05-07 00:36:43,2019-05-07 00:53:44")
      > 
      > data[, minElapsed := as.numeric(EndTime - StartTime)]
      > data[, idleMin := as.numeric(StartTime - shift(EndTime))]
      > data
                    StartTime             EndTime minElapsed   idleMin
       1: 2019-05-06 08:34:15 2019-05-06 08:48:30    14.2500        NA
       2: 2019-05-06 10:07:18 2019-05-06 10:21:34    14.2667  78.80000
       3: 2019-05-06 15:13:10 2019-05-06 15:27:26    14.2667 291.60000
       4: 2019-05-06 15:35:52 2019-05-06 15:50:07    14.2500   8.43333
       5: 2019-05-06 16:14:18 2019-05-06 16:33:58    19.6667  24.18333
       6: 2019-05-06 16:58:14 2019-05-06 17:13:36    15.3667  24.26667
       7: 2019-05-06 20:28:50 2019-05-06 21:05:11    36.3500 195.23333
       8: 2019-05-06 21:55:53 2019-05-06 22:16:50    20.9500  50.70000
       9: 2019-05-06 22:42:21 2019-05-06 22:57:46    15.4167  25.51667
      10: 2019-05-06 23:26:59 2019-05-07 00:03:46    36.7833  29.21667
      11: 2019-05-07 00:36:43 2019-05-07 00:53:44    17.0167  32.95000
      > 
      

      原始答案如下

      代码

      data <- read.csv(text="StartTime,EndTime
      2019-05-06 08:34:15,2019-05-06 08:48:30
      2019-05-06 10:07:18,2019-05-06 10:21:34
      2019-05-06 15:13:10,2019-05-06 15:27:26
      2019-05-06 15:35:52,2019-05-06 15:50:07
      2019-05-06 16:14:18,2019-05-06 16:33:58
      2019-05-06 16:58:14,2019-05-06 17:13:36
      2019-05-06 20:28:50,2019-05-06 21:05:11
      2019-05-06 21:55:53,2019-05-06 22:16:50
      2019-05-06 22:42:21,2019-05-06 22:57:46
      2019-05-06 23:26:59,2019-05-07 00:03:46
      2019-05-07 00:36:43,2019-05-07 00:53:44")
      
      data$StartTime     <- as.POSIXct(data$StartTime)
      data$EndTime       <- as.POSIXct(data$EndTime)
      
      data$IdlingTime    <- data$EndTime - data$StartTime
      data$IdlingTimeMin <- as.numeric(data$EndTime - data$StartTime)
      

      输出

      > data
                   StartTime             EndTime   IdlingTime IdlingTimeMin
      1  2019-05-06 08:34:15 2019-05-06 08:48:30 14.2500 mins       14.2500
      2  2019-05-06 10:07:18 2019-05-06 10:21:34 14.2667 mins       14.2667
      3  2019-05-06 15:13:10 2019-05-06 15:27:26 14.2667 mins       14.2667
      4  2019-05-06 15:35:52 2019-05-06 15:50:07 14.2500 mins       14.2500
      5  2019-05-06 16:14:18 2019-05-06 16:33:58 19.6667 mins       19.6667
      6  2019-05-06 16:58:14 2019-05-06 17:13:36 15.3667 mins       15.3667
      7  2019-05-06 20:28:50 2019-05-06 21:05:11 36.3500 mins       36.3500
      8  2019-05-06 21:55:53 2019-05-06 22:16:50 20.9500 mins       20.9500
      9  2019-05-06 22:42:21 2019-05-06 22:57:46 15.4167 mins       15.4167
      10 2019-05-06 23:26:59 2019-05-07 00:03:46 36.7833 mins       36.7833
      11 2019-05-07 00:36:43 2019-05-07 00:53:44 17.0167 mins       17.0167
      > 
      

      【讨论】:

      • 这不是我想要的。假设第 10 行的空闲时间是 2019-05-07 00:36:43 减去 2019-05-07 00:03:46 = 32.95 分钟
      • 在 StackOverflow 的经验告诉我们,在您的问题中保持精确和(理想情况下是可重现的)会有所帮助。我们都生活和学习,也许下次你会这样问它,你会更清楚你真正想要什么。莫斯科的回答也有帮助。我可能会删除这个答案,因为我现在没有时间完善。但是xtszoo 包都有助于解决滞后问题,data.table 也非常好。
      • 更新下面的答案; data.table 很容易,虽然还有很多其他方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2017-05-21
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多