如何计算数据框中两次快照间的服务日期数与实际运营天数
解决R语言中基于route_days计算路线实际运营天数的问题
核心思路
要精准计算每条路线的实际运营天数,需结合服务日历的有效日期和route_days定义的运营周期,核心逻辑如下:
- 给服务日历标注有效服务日期、对应星期几(设定周一为一周起始,匹配route_days的定义)
- 将route_days映射为允许运营的星期范围(比如
route_days=3对应周一、周二、周三) - 对每条路线的快照区间,筛选出「在区间内+有服务+属于允许星期范围」的日期,统计总数即为实际运营天数
完整代码示例
1. 构造最小示例数据
library(tidyverse) # 服务日历:包含日期、是否有服务、星期数字(周一=1,周日=7) service_calendar <- tibble( date = seq.Date(as.Date("2024-05-06"), as.Date("2024-05-19"), by = "day"), has_service = c(1,1,1,1,1,0,0,1,1,1,0,1,1,0), # 0=无服务(周末/节假日) wday_num = wday(date, week_start = 1) # 强制周一为一周第1天 ) # 路线快照数据:路线ID、运营周期、快照起止日期 route_snapshots <- tibble( route_id = c("R001", "R002", "R003"), route_days = c(1, 3, 5), # 1=仅周一,3=周一至周三,5=周一至周五 snapshot_start = as.Date("2024-05-06"), snapshot_end = as.Date("2024-05-19") )
2. 计算每条路线的实际运营天数
route_operating_days <- route_snapshots %>% rowwise() %>% mutate( # 筛选符合所有条件的日期并统计数量 actual_operating_days = sum( service_calendar$date >= snapshot_start & service_calendar$date <= snapshot_end & service_calendar$has_service == 1 & service_calendar$wday_num <= route_days ) ) %>% ungroup() # 输出结果 print(route_operating_days)
关键细节说明
- 用
wday(date, week_start = 1)确保周一对应数字1,完全匹配route_days的规则(1=仅周一,2=周一至周二…) - 必须同时校验「服务日历有效」和「属于允许星期范围」两个条件,避免将节假日/无服务日误算入
- 代码自动处理快照区间的跨周期问题,无需额外针对周度快照缺失做特殊逻辑
内容的提问来源于stack exchange,提问作者Morrigan
相关产品推荐
相关产品推荐

