如何为DataFrame补充缺失时间戳的行
解决DataFrame缺失时间戳补全及统计问题
问题分析
需要针对多类别DataFrame补全缺失的时间戳:
- 缺失行的时间为上一行时间加6分钟
- 同一个类别可能存在多个独立的时间序列区间(如跨天的Timestamp重新从1开始)
- 最终按类别统计补充行占总行数的百分比
解决方案(R语言,tidyverse生态)
1. 加载依赖包
library(tidyverse) library(lubridate)
2. 定义补全函数
该函数处理单个类别内的时间序列,识别缺失的Timestamp并生成对应行:
fill_missing_timestamps <- function(group_df) { # 确保组内数据按时间排序 group_df <- group_df %>% arrange(Time) # 初始化结果列表,先加入第一行数据 result <- list(group_df[1, ]) # 遍历组内后续每一行,对比前一行生成缺失数据 for (i in 2:nrow(group_df)) { prev_row <- group_df[i-1, ] curr_row <- group_df[i, ] ts_diff <- curr_row$Timestamp - prev_row$Timestamp # 当Timestamp差值大于1时,生成缺失行 if (ts_diff > 1) { missing_ts <- seq(prev_row$Timestamp + 1, curr_row$Timestamp - 1, by = 1) # 按上一行时间累加6分钟生成缺失时间 missing_time <- prev_row$Time + minutes(6 * seq_along(missing_ts)) missing_rows <- tibble( Class = prev_row$Class, Time = missing_time, Timestamp = missing_ts ) # 将缺失行和当前行加入结果 result <- c(result, list(missing_rows), list(curr_row)) } else { # 无缺失直接加入当前行 result <- c(result, list(curr_row)) } } # 合并所有行并返回 bind_rows(result) }
3. 应用补全到整个DataFrame
以你提供的第二个示例数据为例:
# 构造示例数据 df <- tibble( Class = "1", Time = ymd_hms(c("2021-03-12 14:42:45", "2021-03-12 14:48:12", "2021-03-12 14:54:12", "2021-03-12 15:06:16", "2021-04-19 12:06:12", "2021-04-19 12:12:56", "2021-04-19 12:18:32", "2021-04-19 12:30:21", "2021-04-19 12:36:08")), Timestamp = c(1,2,3,5,1,2,3,5,6) ) # 按Class分组并补全数据 filled_df <- df %>% group_by(Class) %>% group_modify(~ fill_missing_timestamps(.x)) %>% ungroup()
补全后的filled_df会包含所有缺失的时间戳行,符合你给出的修正后格式。
4. 统计补充行占比
# 统计原数据各类别行数 original_counts <- df %>% count(Class, name = "original_rows") # 统计补全后各类别行数 filled_counts <- filled_df %>% count(Class, name = "filled_rows") # 计算补充行数及占比 stats_df <- original_counts %>% left_join(filled_counts, by = "Class") %>% mutate( added_rows = filled_rows - original_rows, added_percentage = round((added_rows / filled_rows) * 100, 2) )
stats_df会输出每个类别:原始行数、补全行数、新增行数、新增行占总行数的百分比(保留两位小数)。
内容的提问来源于stack exchange,提问作者TRM
相关产品推荐
相关产品推荐

