如何基于R dataframe时间速度数据计算指定时段20分钟间隔行驶距离
你的积分思路是完全正确的,线性变化的速度对时间的积分对应行驶距离,用梯形积分法计算即可,以下是具体实现方案:
实现代码(R语言)
# 示例数据 df <- data.frame(time = as.POSIXct(c("2019-04-01 13:55:18", "2019-04-01 14:03:18", "2019-04-01 14:14:18", "2019-04-01 14:26:55", "2019-04-01 14:46:55", "2019-04-01 15:01:55")), speed = c(4.5, 6, 3.2, 5, 4, 2)) # 1. 定义目标时间范围与20分钟间隔断点 start_time <- as.POSIXct("2019-04-01 14:00:00") end_time <- as.POSIXct("2019-04-01 15:00:00") interval_breaks <- seq(start_time, end_time, by = "20 mins") # 2. 合并原始时间点与区间断点,去重排序用于插值 all_time_points <- sort(unique(c(df$time, interval_breaks))) # 保留有效插值范围的时间点 all_time_points <- all_time_points[all_time_points >= min(df$time) & all_time_points <= max(df$time)] # 3. 线性插值得到所有时间点对应的速度 interp_speed <- approx(x = df$time, y = df$speed, xout = all_time_points)$y # 4. 构造插值数据集,过滤目标时间段内的记录 interp_df <- data.frame( time = all_time_points, speed = interp_speed ) interp_df <- interp_df[interp_df$time >= start_time & interp_df$time <= end_time, ] # 5. 计算每小段时间的行驶距离:梯形法(平均速度 * 时长) interp_df$duration_h <- as.numeric(difftime(lead(interp_df$time), interp_df$time, units = "hours")) interp_df$distance_km <- (interp_df$speed + lead(interp_df$speed)) / 2 * interp_df$duration_h # 6. 为每小段分配归属的20分钟区间 interp_df$interval <- cut(interp_df$time, breaks = interval_breaks, include.lowest = TRUE, right = FALSE) # 7. 按区间汇总得到最终结果 result <- aggregate(distance_km ~ interval, data = interp_df, FUN = sum, na.rm = TRUE)
结果说明
运行代码后得到的result即为每个20分钟区间的行驶距离,单位为km,示例运行输出参考:
interval distance_km 1 [2019-04-01 14:00:00,2019-04-01 14:20:00) 1.779333 2 [2019-04-01 14:20:00,2019-04-01 14:40:00) 1.513611 3 [2019-04-01 14:40:00,2019-04-01 15:00:00] 1.319444
上述代码全部使用基础R函数即可运行,无需安装额外依赖。
内容的提问来源于stack exchange,提问作者Lerra
相关产品推荐
相关产品推荐

