You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R脚本计算小时级数据完整性的问题排查与优化请求

修复方案与优化实现

问题1:数据完整性计算与缺失日期识别错误

核心原因

  • 现有脚本仅统计存在数据的日期,完全缺失的日期(如3月11-14日)不会出现在data_summary中,无法被可视化;
  • 用n()计算total_hours是取当天实际存在的行数,而非一天应有的24小时,导致部分日期(如3月8、10日)即使缺少部分小时数据,也会被误判为100%完整。

修复步骤

  1. 生成目标年份的完整日期序列,确保所有日期都被纳入统计;
  2. 将total_hours固定为24,基于标准小时数计算完整性;
  3. 新增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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:17:09