【问题标题】:How to calculate time difference of two columns with a lag如何计算具有滞后的两列的时间差
【发布时间】:2020-10-18 09:07:14
【问题描述】:

我目前正面临着纽约市一名司机的出租车行程数据集。我得到了司机 ID 以及每次旅行的接送日期和时间以及下车日期和时间。现在我想计算上一次行程的下车时间和新行程的接送时间之间的等待时间。因此,我必须计算两列之间的时间差,其中包含一个 Lag(因为下车时间是指最后一次旅行和下一次旅行的接送时间(下一列)),按驾驶员 ID 分组(以确保我没有计算时间差在两个不同司机的行程之间)。

可能的数据集如下所示:

hack_license = c("303F79923DA5DA7A10DF15E2D91CDCF7","697ABFCDF7E7C77A01183C857132F2A4","697ABFCDF7E7C77A01183C857132F2A4","697ABFCDF7E7C77A01183C857132F2A4","ABE23CA71E2DE84972281BA1C70B6EBB","ABE23CA71E2DE84972281BA1C70B6EBB","BA83D7C383EAA4F9D78A1A8B83CB3E92","BA83D7C383EAA4F9D78A1A8B83CB3E92","D476A1872F1F6594BD638C274483ED06","D476A1872F1F6594BD638C274483ED06")

pickup_datetime = c("2013-12-31 23:01:07","2013-12-31 23:04:00","2013-12-31 23:31:00","2013-12-31 23:40:00","2013-12-31 23:16:39","2013-12-31 23:24:05","2013-12-31 23:09:10","2013-12-31 23:26:26","2013-12-31 23:13:00","2013-12-31 23:22:00")

dropoff_datetime = c("2013-12-31 23:20:33","2013-12-31 23:28:00","2013-12-31 23:33:00","2013-12-31 23:48:00","2013-12-31 23:22:29","2013-12-31 23:28:37","23:21:24","2013-12-31 23:36:54","2013-12-31 23:20:00","2013-12-31 23:27:00")

data <- data.frame(hack_license,pickup_datetime,dropoff_datetime)

我尝试像这样使用 dplyr 和 lubridate,但它不起作用。

data %>%
group_by(data$hack_license) %>%
  group_by(hack_license) %>%
  mutate(waiting_time_in_secs = difftime(pickup_datetime,                                       
lag(dropoff_datetime), units = 'secs'))

也许你们中的一些人可以在这里帮助我。会很棒!

【问题讨论】:

  • 在使用%&gt;% 时不要通过$ 使用列名
  • 是的,我已经试过不用$了。无论哪种方式:mutate_all() 忽略了以下分组变量:列hack_license

标签: r dplyr lubridate difftime


【解决方案1】:

您可以为上车和下车创建一个日期时间列,并为每个hack_license 计算当前上车时间和上一次下车​​时间之间的时间差。

library(dplyr)
library(lubridate)

data <- data %>%
          mutate(pickup_datetime = ymd_hms(pickup_datetime), 
                 dropoff_datetime = ymd_hms(dropoff_datetime)) %>%
           group_by(hack_license) %>%
           mutate(waiting_time_in_secs = as.numeric(difftime(pickup_datetime, 
                                lag(dropoff_datetime), units = 'secs')))
data
#   hack_license                     pickup_datetime     dropoff_datetime    waiting_time_in_secs
#   <chr>                            <dttm>              <dttm>                             <dbl>
# 1 303F79923DA5DA7A10DF15E2D91CDCF7 2013-12-31 23:01:07 2013-12-31 23:20:33                   NA
# 2 697ABFCDF7E7C77A01183C857132F2A4 2013-12-31 23:04:00 2013-12-31 23:28:00                   NA
# 3 697ABFCDF7E7C77A01183C857132F2A4 2013-12-31 23:31:00 2013-12-31 23:33:00                  180
# 4 697ABFCDF7E7C77A01183C857132F2A4 2013-12-31 23:40:00 2013-12-31 23:48:00                  420
# 5 ABE23CA71E2DE84972281BA1C70B6EBB 2013-12-31 23:16:39 2013-12-31 23:22:29                   NA
# 6 ABE23CA71E2DE84972281BA1C70B6EBB 2013-12-31 23:24:05 2013-12-31 23:28:37                   96
# 7 BA83D7C383EAA4F9D78A1A8B83CB3E92 2013-12-31 23:09:10 2013-12-31 23:21:24                   NA
# 8 BA83D7C383EAA4F9D78A1A8B83CB3E92 2013-12-31 23:26:26 2013-12-31 23:36:54                  302
# 9 D476A1872F1F6594BD638C274483ED06 2013-12-31 23:13:00 2013-12-31 23:20:00                   NA
#10 D476A1872F1F6594BD638C274483ED06 2013-12-31 23:22:00 2013-12-31 23:27:00                  120

【讨论】:

  • 嗨罗纳克,谢谢你的回复。我尝试了你的想法,它说: get(genname, envir = envir) 中的错误:找不到对象'vec_ptype2' 你知道这意味着什么以及我现在必须做什么吗?
  • Ronak,当它从 excel 读取时间列时,您是否也使用 gsub 转换 R 自动选择的“日期时间”?例如,当我执行 read_excel 时,它会将时间“10:30:10”设为“1899-12-31 10:30:10”
  • @MaxS 这意味着您正在调用数据中不存在的列。 vec_ptype2 是什么?我使用基于数据图像的列名。如果您在对数据应用答案时仍有问题,我建议您使用dput 添加部分数据。使用dput(head(data, 10)) 编辑您的帖子。
  • @KarthikS 在从 excel 读取时间到 R 时,我还没有遇到过这样的问题。
  • @Ronak,我正在尝试,但我的数据框似乎太大而无法使用 dput 。我已经尝试使用head()top_n 将其分解,但问题仍然存在。是否有另一种方法来创建足够的数据示例?
猜你喜欢
  • 2022-06-15
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
相关资源
最近更新 更多