如何按月份聚合机场每小时到达数据并填补缺失值?
解决机场小时级到达数据缺失的问题
嘿,我懂你碰到的这个痛点——当机场数据里某些小时因为没航班直接缺失时,光靠dplyr::group_by确实没法自动补全这些空白。别慌,咱们用dplyr搭配tidyr就能轻松解决,来一步步看:
第一步:整理日期时间字段(如果还没做的话)
首先得确保你的数据有清晰的年月和小时维度,或者能构建出完整的日期时间戳。用lubridate包来处理会很方便:
library(dplyr) library(tidyr) library(lubridate) # 假设你的数据集叫airport_data,包含year、month、hour、arrivals字段 airport_data <- airport_data %>% mutate(datetime = make_datetime(year, month, 1, hour)) # 构建基础日期时间(日设为1不影响小时级分组)
第二步:补全每个月份的完整小时序列
这是核心步骤!我们按年月分组,然后用complete()函数生成每个月份0-23点的所有小时,同时填充缺失的到达数据:
full_hourly_data <- airport_data %>% # 按年、月分组,确保每个月份单独处理 group_by(year, month) %>% # 补全0到23点的所有小时,缺失的到达数填0(按需可改为NA) complete(hour = 0:23, fill = list(arrivals = 0)) %>% ungroup()
这里的complete()会自动检查每个分组里的hour列,把缺失的小时行补出来,fill参数可以指定缺失值的填充内容——没航班的话填0很合理,要是你需要保留缺失标记,去掉fill参数就行。
第三步:适配多维度数据(如果有额外分类的话)
如果你的数据还有其他维度(比如不同航站楼、航线),只需要在group_by里加上对应的字段就行:
full_hourly_data <- airport_data %>% group_by(year, month, terminal) %>% complete(hour = 0:23, fill = list(arrivals = 0)) %>% ungroup()
进阶:处理带具体日期的小时数据
要是你的数据包含具体日期(比如每天的小时),可以生成整个月份的完整小时时间戳来补全:
full_hourly_data <- airport_data %>% group_by(year, month) %>% # 生成该月从第一天到最后一天的每小时序列 complete(datetime = seq( from = make_datetime(year, month, 1), to = make_datetime(year, month, days_in_month(month)), by = "hour" ), fill = list(arrivals = 0)) %>% ungroup()
days_in_month()会自动获取每个月的天数,确保序列覆盖整个月份的所有小时。
简单来说,核心思路就是先为每个月份构建完整的小时集合,再把原始数据和这个集合匹配,自动补全缺失的行。这样就能得到每个月份每小时都存在的完整数据集啦!
内容的提问来源于stack exchange,提问作者Dimitar Kirilov
相关产品推荐
相关产品推荐

