r - 将行程持续时间转换为停车持续时间
问题描述
我有几十万人的旅行持续时间数据,我想做的是将旅行持续时间表转换为新数据框中每个人的停车持续时间,如图所示。有可能在R中做吗?这可能很容易,但由于我是 R 的新手,所以我很挣扎。任何帮助表示赞赏。
解决方案
如果您将时间转换为POSIXct
它将添加日期,但可以在提供最终结果之前将其删除。
这种方法不一定是最快的,但可能对您有用。添加的行取决于上end_time
一行和下一行start_time
。
它会在您的数据之前和之后添加午夜,ID
以包括午夜的时间间隔。
library(dplyr)
result <- data.frame(ID = as.numeric(),
start = as.POSIXct(character()),
end = as.POSIXct(character()))
df$start_time <- as.POSIXct(df$start_time, format = "%H:%M")
df$end_time <- as.POSIXct(df$end_time, format = "%H:%M")
first_time <- as.POSIXct("00:00", format = "%H:%M")
last_time <- as.POSIXct("24:00", format = "%H:%M")
for (i in unique(df$ID)) {
sub_i <- bind_rows(
data.frame(ID = i, start_time = first_time, end_time = first_time),
subset(df, ID == i),
data.frame(ID = i, start_time = last_time, end_time = last_time)
)
adding <- data.frame(ID = i, start = sub_i$end_time[-nrow(sub_i)], end = sub_i$start[-1])
adding <- adding[adding$start <= adding$end, ]
result <- bind_rows(result, adding)
}
result$start <- format(result$start, "%H:%M")
result$end <- format(result$end, "%H:%M")
result[order(result$ID, result$start), c("ID", "start", "end")]
输出
ID start end
1 2353 00:00 06:00
2 2353 06:30 11:20
3 2353 12:00 16:00
4 2353 16:30 00:00
5 3232 00:00 07:00
6 3232 07:45 18:00
7 3232 18:45 00:00
数据
df <- data.frame(
ID = c(2353,2353,2353,3232,3232),
start_time = c("6:00", "11:20", "16:00", "7:00", "18:00"),
end_time = c("6:30", "12:00", "16:30", "7:45", "18:45")
)
编辑:
现在将保留旧代码,直到我们确认它有效。
我不确定您使用什么来读取 Excel 文件,但在这里我使用了readxl
.
阅读文件后,它已经是POSIXct
格式,所以我注释掉了这些行。日期是 1899-12-31 的起源。我UTC
在这里添加了时区以保持一致。
让我知道这个是否奏效。
library(dplyr)
library(readxl)
df <- readxl::read_xlsx("pkw_r_R.xlsx")
# df <- data.frame(
# ID = c(2353,2353,2353,3232,3232,4100),
# start_time = c("6:00", "11:20", "16:00", "7:00", "18:00", "05:00"),
# end_time = c("6:30", "12:00", "16:30", "7:45", "18:45", "00:00")
# )
result <- data.frame(hp_id = as.numeric(),
start = as.POSIXct(character()),
end = as.POSIXct(character()))
# df$start_time <- as.POSIXct(df$start_time, format = "%H:%M")
# df$end_time <- as.POSIXct(df$end_time, format = "%H:%M")
first_time <- as.POSIXct("1899-12-31 00:00", format = "%Y-%m-%d %H:%M", tz = "UTC")
last_time <- as.POSIXct("1899-12-31 24:00", format = "%Y-%m-%d %H:%M", tz = "UTC")
for (i in unique(df$hp_id)) {
sub_i <- bind_rows(
data.frame(hp_id = i, st_time = first_time, end_time = first_time),
subset(df, hp_id == i),
data.frame(hp_id = i, st_time = last_time, end_time = last_time)
)
print(i)
adding <- data.frame(hp_id = i, start = sub_i$end_time[-nrow(sub_i)], end = sub_i$st_time[-1])
adding <- adding[adding$start <= adding$end, ]
result <- bind_rows(result, adding)
}
result$start <- format(result$start, "%H:%M")
result$end <- format(result$end, "%H:%M")
result[order(result$hp_id, result$start), c("hp_id", "start", "end")]
推荐阅读
- angular - 堆叠的 ng 引导模式失去焦点
- java - 使用 apache poi 将 .docx 文件转换为 pdf 会丢弃图像
- c# - 如何将 php 的 mb_convert_encoding() 转换为 C# 等效项
- c++ - 运动图像后的 SDL 跟踪
- java - 将 PriorityQueue 转换为排序数组的最佳方法
- css - css 动画在 Internet Explorer 上无法正常工作
- spring - 如何在 Spring Boot 中访问通过命令行传递的属性
- sql - 查询数据库中的行直到值改变
- css - BEM命名和定位
- firebase - Flutter Firebase 儿童计数