构建航班地面停留区间并计算单站最大同时在港航班数
单站最大同时在港航班数计算方案(R语言)
核心逻辑
计算单站最大同时在港数,最高效的方式是事件点统计法:将航班到达视为「在港数+1」事件,出发视为「在港数-1」事件,按时间排序后遍历统计,记录峰值即可。无需复杂的区间配对,逻辑清晰且性能更优。
步骤实现
1. 数据预处理(确保时间格式正确)
首先将时间列转换为POSIXct格式,保证时间计算有效:
library(dplyr) # 构造示例数据(替换为你的实际数据) df <- data.frame( REG = c("XYZ", "XYZ", "KLN", "KLN"), DEP = c("ZRH", "GVA", "MUC", "GVA"), ARV = c("GVA", "ZRH", "GVA", "CGD"), STD = as.POSIXct(c("2021-08-01 07:20:00", "2021-08-01 09:20:00", "2021-08-01 06:00:00", "2021-08-01 08:45:00")), STA = as.POSIXct(c("2021-08-01 08:35:00", "2021-08-01 10:35:00", "2021-08-01 07:10:00", "2021-08-01 10:10:00")) )
2. 生成事件数据集
拆分到达和出发事件,标记数量变化:
# 到达事件:机场为目的地ARV,时间为STA,在港数+1 arrival_events <- df %>% select(airport = ARV, time = STA, delta = 1) # 出发事件:机场为出发地DEP,时间为STD,在港数-1 departure_events <- df %>% select(airport = DEP, time = STD, delta = -1) # 合并并按机场、时间排序 all_events <- bind_rows(arrival_events, departure_events) %>% arrange(airport, time)
3. 计算最大同时在港数
按机场分组,累计事件变化值,取最大值:
max_on_ground <- all_events %>% group_by(airport) %>% mutate(current_count = cumsum(delta)) %>% summarise(max_simultaneous = max(current_count, na.rm = TRUE)) # 查看结果 print(max_on_ground)
示例数据运行后,GVA机场的最大同时在港数为2,符合预期。
补充:正确的停留区间构建方法
如果确实需要构建航班在机场的停留区间(比如用于其他分析),可以通过同一飞机(REG)的航班序列配对:
library(dplyr) stay_intervals <- df %>% group_by(REG) %>% arrange(STD) %>% # 按出发时间排序,保证航班顺序正确 mutate( stay_airport = lag(ARV), # 前一班的到达机场即停留机场 stay_start = lag(STA), # 停留开始时间为前一班的到达时间 stay_end = STD # 停留结束时间为当前班的出发时间 ) %>% # 过滤有效停留:排除首班(无前序航班),且当前出发机场等于前序到达机场 filter(!is.na(stay_airport) & stay_airport == DEP) %>% select(REG, stay_airport, stay_start, stay_end) # 查看区间结果 print(stay_intervals)
原代码问题分析
你编写的代码存在以下核心问题:
- 嵌套循环遍历所有i/j,未关联同一飞机(REG)的航班,导致区间配对完全错误
min(df$STD[i])仅取单一行的STD值(无意义),未针对同一REG的航班做时间关联- 函数最终仅返回单个区间,无法覆盖所有航班的停留情况
内容的提问来源于stack exchange,提问作者Sony
相关产品推荐
相关产品推荐

