我有一个包含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)来计算空闲时间。假设第一行IdlingTime是: StartTime的第二行- EndTime的第一行=1小时18分48秒,并转换为分钟。
谢谢你的预支。
发布于 2021-09-08 13:02:41
更新如果你的数据已经是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)库(Lubridate)
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发布于 2021-09-08 13:05:44
这就是我要做的。
df %>%
mutate_all(dmy_hm) %>%
mutate(
IdlingTime = as.double(lead(StartTime)-EndTime, units = "mins")
)发布于 2021-09-08 13:08:20
你只需要减去这些列。
这是(可重现的,带着你的数据!)给定更新后的问题的代码。我使用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
> https://stackoverflow.com/questions/69103420
复制相似问题