You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用tidy方法在R中查找行程数据的缺失日期区间?

寻找行程时间线中的中断时段

我有一个包含起始日期(start)和结束日期(end)的数据框,每一行代表一段特定行程。这些日期范围构成了一条连续的时间线,但4月左右存在一处数据中断/缺失(因未产生任何行程)。希望找到该时段的起始和结束日期,优先采用tidy方法。

原数据与可视化

library(tidyverse)

df <- data.frame(
  start = as.Date(c("2022-01-03", "2022-01-18", "2022-01-31", "2022-03-01", "2022-03-08", "2022-03-09", "2022-04-15",
                    "2022-04-20", "2022-04-20", "2022-05-03", "2022-05-17", "2022-05-17", "2022-05-31", "2022-06-05", "2022-06-22", "2022-06-28", "2022-07-11")), 
  end = as.Date(c("2022-01-18", "2022-01-31", "2022-03-01", "2022-03-08", "2022-03-09", "2022-03-25", "2022-04-20", "2022-04-20", "2022-05-03",
                  "2022-05-17", "2022-05-17", "2022-05-31", "2022-06-05", "2022-06-22", "2022-06-28", "2022-07-11", "2022-07-17"))
) %>% 
  mutate(trip_number = as.character(row_number()))

# 可视化行程时间线
df %>% 
  ggplot() +
  geom_segment(aes(x = start, xend = end, y = 0, yend = 0, col = trip_number)) +
  theme(legend.position = "none")

行程时间线

由reprex包(v2.0.1)于2022-07-17生成

tidy方法解决方案

通过对比连续行程的结束与起始日期,找出时间间隔大于0的时段,就是我们要找的中断期:

df %>%
  arrange(start) %>%  # 确保行程按时间顺序排列
  mutate(
    prev_end = lag(end),  # 获取上一段行程的结束日期
    gap_start = prev_end + 1,  # 中断起始日:上一段结束的次日
    gap_end = start - 1,  # 中断结束日:当前段开始的前一日
    gap_days = gap_end - gap_start + 1  # 计算中断天数
  ) %>%
  filter(gap_days > 0) %>%  # 筛选出存在中断的记录
  select(gap_start, gap_end, gap_days)

运行后输出结果:

gap_start    gap_end gap_days
1 2022-03-26 2022-04-14       20

逻辑说明

  1. 先按起始日期排序,保证行程的时间顺序正确,避免因数据顺序混乱导致计算错误
  2. 用lag(end)提取上一行的结束日期,和当前行的起始日期做对比
  3. 中断时段的起始是上一段行程结束的次日,结束是当前段行程开始的前一日
  4. 筛选出中断天数大于0的记录,就是存在缺失的时段

内容的提问来源于stack exchange,提问作者CyG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:18:25