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

R语言按ISO周识别数据采集时间缺口并统计周内有效采集天数

ISO周维度采集数据缺口处理方案

原始数据集字段规范

处理前的输入数据集需包含以下字段:

  • group:数据分组标识
  • begin.date:数据采集开始日期,支持标准日期格式输入
  • end.date:数据采集结束日期,支持标准日期格式输入
  • detect:对应采集时段的检出计数
  • yearwk_detect:检出值对应的年份ISO周编号(处理过程中会自动重新计算,原始输入值不会直接复用)

时间缺口判定规则

同一分组下相邻两条采集记录,若上一条记录的end.date与下一条记录的begin.date不相等,即判定存在数据采集时间缺口。

核心处理逻辑

  • 以ISO周为最小分析粒度,按group分组统计每个ISO周内的实际有效采集天数(输出字段名data_days):如果单条采集记录跨多个ISO周,会自动拆分到对应周,分别计算采集时段和周日期范围的重叠天数。
  • 自动覆盖分析时间范围内的所有ISO周:如果某一整周没有任何采集活动(即整周级时间缺口),会自动补充该周记录,其中begin.date、end.date填充NA,detect列标记为temporal gap,data_days记为0。
  • 逻辑适配多年度长时序数据,日期与ISO周的转换通过ISOweek包实现,避免周数跨年计算偏差。

可直接运行的实现代码

# 加载依赖包
library(dplyr)
library(tidyr)
library(lubridate)
library(ISOweek)
library(purrr)

process_isoweek_gap <- function(raw_data) {
  # 统一转换日期格式
  raw_data <- raw_data %>%
    mutate(
      begin.date = as.Date(begin.date),
      end.date = as.Date(end.date)
    )

  # 拆分跨周采集段,按周统计有效采集天数
  split_crossweek_period <- function(start_date, end_date, grp_id, detect_val) {
    all_dates <- seq.Date(start_date, end_date, by = "day")
    tibble(
      date = all_dates,
      yearwk_detect = ISOweek(all_dates)
    ) %>%
      group_by(yearwk_detect) %>%
      summarise(
        data_days = n(),
        begin.date = min(date),
        end.date = max(date),
        detect = detect_val,
        group = grp_id,
        .groups = "drop"
      )
  }

  # 逐行处理所有原始记录
  week_level_data <- pmap_dfr(
    list(raw_data$begin.date, raw_data$end.date, raw_data$group, raw_data$detect),
    ~split_crossweek_period(..1, ..2, ..3, ..4)
  )

  # 生成数据集覆盖时间范围内的全量ISO周序列
  time_range_min <- floor_date(min(raw_data$begin.date, na.rm = T), "week", week_start = 1)
  time_range_max <- ceiling_date(max(raw_data$end.date, na.rm = T), "week", week_start = 1) - days(1)
  all_isoweeks <- ISOweek(seq.Date(time_range_min, time_range_max, by = "week"))

  # 按分组生成全量周栅格,补全缺口
  full_grid <- expand.grid(
    group = unique(raw_data$group),
    yearwk_detect = all_isoweeks,
    stringsAsFactors = F
  )

  final_result <- full_grid %>%
    left_join(week_level_data, by = c("group", "yearwk_detect")) %>%
    mutate(
      data_days = replace_na(data_days, 0),
      detect = ifelse(is.na(detect), "temporal gap", as.character(detect))
    ) %>%
    select(group, yearwk_detect, begin.date, end.date, detect, data_days) %>%
    arrange(group, yearwk_detect)

  return(final_result)
}

使用方式

将符合字段规范的原始数据框作为参数传入process_isoweek_gap()即可,函数会自动返回处理完成的结果,无需额外手动配置周范围或分组参数。


内容的提问来源于stack exchange,提问作者novice_coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:42:16