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
相关产品推荐
相关产品推荐

