R脚本计算小时级数据完整性的问题排查与优化请求
修复方案与优化实现
问题1:数据完整性计算与缺失日期识别错误
核心原因
- 现有脚本仅统计存在数据的日期,完全缺失的日期(如3月11-14日)不会出现在
data_summary中,无法被可视化; - 用
n()计算total_hours是取当天实际存在的行数,而非一天应有的24小时,导致部分日期(如3月8、10日)即使缺少部分小时数据,也会被误判为100%完整。
修复步骤
- 生成目标年份的完整日期序列,确保所有日期都被纳入统计;
- 将
total_hours固定为24,基于标准小时数计算完整性; - 新增
completeness_category列,按预设阈值分类:- 100%:完整小时数=24
90%:完整小时数≥22(22/24≈91.7%)且<24
- <90%:完整小时数<22
- 缺失:完整小时数=0
问题2:可视化图例不符合预期
核心原因
现有脚本使用渐变颜色图例,无法清晰区分预设的四类完整性等级。
修复步骤
- 改用离散颜色映射,为每个分类指定明确颜色;
- 调整图例为分类式,直接显示四类标签。
完整优化脚本
# 加载必要库 library(dplyr) library(ggplot2) library(lubridate) # 读取数据,跳过前14行 file_path <- "C:/R SOFTWARE/Air_Temp.Hourly_Air_Temp_(Degrees_C)@BJ_VOK.20220101.csv" data <- read.csv(file_path, skip = 14, header = TRUE, stringsAsFactors = FALSE) # 解析Timestamp列 data$Timestamp <- as.POSIXct(data$Timestamp, format = "%Y-%m-%d %H:%M") # 获取数据覆盖的年份,自动适配全年/部分年份数据 target_year <- year(min(data$Timestamp)) # 生成目标年份的完整日期序列 full_dates <- tibble(date = seq(as.Date(paste0(target_year, "-01-01")), as.Date(paste0(target_year, "-12-31")), by = "day")) # 按日计算数据完整性 data_summary <- data %>% mutate(date = as.Date(Timestamp)) %>% group_by(date) %>% summarize( complete_hours = sum(!is.na(Value)), .groups = "drop" ) %>% # 合并完整日期序列,缺失数据的日期complete_hours填充为0 right_join(full_dates, by = "date") %>% mutate( complete_hours = ifelse(is.na(complete_hours), 0, complete_hours), completeness = (complete_hours / 24) * 100, # 按阈值分类 completeness_category = case_when( complete_hours == 24 ~ "100%覆盖", complete_hours >= 22 & complete_hours < 24 ~ ">90%", complete_hours > 0 & complete_hours < 22 ~ "<90%", TRUE ~ "缺失" ), # 分类排序,确保图例顺序正确 completeness_category = factor(completeness_category, levels = c("100%覆盖", ">90%", "<90%", "缺失")) ) # 定义分类颜色 palette color_palette <- c("100%覆盖" = "#2ecc71", ">90%" = "#f1c40f", "<90%" = "#e67e22", "缺失" = "#e74c3c") # 生成可视化热图 heatmap_plot <- ggplot(data_summary, aes(x = month(date), y = day(date))) + geom_tile(aes(fill = completeness_category), color = "white") + # 使用离散颜色映射 scale_fill_manual(values = color_palette, name = "完整性等级") + labs(title = "数据完整性热图", x = "月份", y = "日期") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + scale_x_continuous(breaks = 1:12, labels = month.abb) + scale_y_reverse(breaks = seq(1, 31, by = 1)) # 输出图表 print(heatmap_plot)
关键优化说明
- 自动适配年份:通过
year(min(data$Timestamp))自动获取数据年份,无需手动修改,支持全年/部分年份数据; - 完整日期覆盖:用
right_join合并完整日期序列,确保缺失日期被标记为"缺失"; - 准确完整性计算:基于24小时标准计算百分比,避免因当天数据行数不足导致的误判;
- 清晰分类可视化:离散颜色+分类图例,完美匹配预设的四类完整性等级。
内容的提问来源于stack exchange,提问作者user18486416
相关产品推荐
相关产品推荐

