nycflights13数据集负grounding_time问题排查与解决求助
异常原因分析与解决建议
异常原因
跨夜判断逻辑错误
你用转换后的UTC时间(arr_time_act和dep_time_act)判断跨夜,但航班的UTC到达时间必然晚于UTC起飞时间,这个判断几乎永远返回0,无法处理跨时区且当地到达时间早于当地起飞时间的场景。比如纽约(UTC-5)23:00起飞,洛杉矶(UTC-8)次日01:00到达,当地时间属于跨夜,但UTC时间到达晚于起飞,你的逻辑会忽略这种跨夜情况,导致时间差计算偏小。原始数据存在录入错误
nycflights13基于真实航班数据,存在部分错误:
- 起飞/到达时间录反
- air_time被高估(比如误录其他航班的飞行时间)
- 机场时区匹配错误(比如目的地机场的tz值关联错误)
- 手动时间计算的逻辑漏洞
你先处理分钟差(arr_time_min < dep_time_min)再处理跨夜,可能导致小时计算错误。比如UTC起飞时间23:40,到达时间次日1:30,你会先把到达小时减1、分钟加60,再计算小时差,得到负数的时间差,最终导致grounding_time为负。
解决建议
1. 用专业时间包替代手动计算
手动处理HHMM格式和时区极易出错,推荐用lubridate包处理日期时间,自动处理时区、跨夜等场景:
library(lubridate) library(dplyr) library(nycflights13) # 合并机场时区数据 flights_with_tz <- flights %>% left_join(airports %>% select(faa, tz_origin = tz), by = c("origin" = "faa")) %>% left_join(airports %>% select(faa, tz_dest = tz), by = c("dest" = "faa")) flight_data <- flights_with_tz %>% mutate( # 处理NA值,构造当地起飞/到达时间 dep_local = make_datetime(year, month, day, hour = dep_time %/% 100, min = dep_time %% 100), arr_local = make_datetime(year, month, day, hour = arr_time %/% 100, min = arr_time %% 100), # 处理当地时间跨夜的航班 arr_local = ifelse(arr_time < dep_time, arr_local + days(1), arr_local), # 转换为UTC时间,消除时区影响 dep_utc = with_tz(dep_local, tzone = "UTC"), arr_utc = with_tz(arr_local, tzone = "UTC"), # 计算总耗时(分钟) time_taken_min = as.duration(arr_utc - dep_utc) / dminutes(1), # 计算地面时间,过滤异常值 grounding_time = time_taken_min - air_time, grounding_time = ifelse(grounding_time < 0 | is.na(grounding_time), NA, grounding_time), grounding_prop = round(grounding_time / time_taken_min * 100, 2) ) %>% select(-dep_local, -arr_local, -dep_utc, -arr_utc)
2. 过滤异常数据
对计算结果进行清洗,剔除错误数据:
# 过滤无效数据 flight_data_clean <- flight_data %>% filter(!is.na(air_time), !is.na(time_taken_min), time_taken_min > air_time, time_taken_min < 24*60)
3. 验证时间转换逻辑
如果坚持手动计算,调整逻辑顺序:先处理跨夜(基于当地时间),再计算分钟和小时差,确保时间差为正。
内容的提问来源于stack exchange,提问作者Varun Pandey
相关产品推荐
相关产品推荐

