首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算时间差。R

计算时间差。R
EN

Stack Overflow用户
提问于 2021-09-08 12:48:04
回答 3查看 56关注 0票数 1

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

代码语言:javascript
运行
复制
   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)来计算空闲时间。假设第一行IdlingTime是: StartTime的第二行- EndTime的第一行=1小时18分48秒,并转换为分钟。

谢谢你的预支。

EN

回答 3

Stack Overflow用户

发布于 2021-09-08 13:02:41

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

代码语言:javascript
运行
复制
library(dplyr)
df %>%
  mutate(IdlingTime = round(lead(StartTime)-EndTime))

输出:

代码语言:javascript
运行
复制
  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)库(Lubridate)

代码语言:javascript
运行
复制
df %>% 
 #mutate(across(contains("Time"), ~ymd_hms(.))) 
         IdlingTime = lead(StartTime)-EndTime)

输出:

代码语言:javascript
运行
复制
   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
票数 0
EN

Stack Overflow用户

发布于 2021-09-08 13:05:44

这就是我要做的。

代码语言:javascript
运行
复制
df %>%
  mutate_all(dmy_hm)  %>%
  mutate(
    IdlingTime = as.double(lead(StartTime)-EndTime, units = "mins")
  )
票数 0
EN

Stack Overflow用户

发布于 2021-09-08 13:08:20

你只需要减去这些列。

这是(可重现的,带着你的数据!)给定更新后的问题的代码。我使用data.table,它可以在读取时将数据列解析为POSIXct,并且使前导/滞后变得容易

代码

代码语言:javascript
运行
复制
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

输出

代码语言:javascript
运行
复制
> 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
> 

原始答案如下

代码

代码语言:javascript
运行
复制
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)

输出

代码语言:javascript
运行
复制
> 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
> 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69103420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档