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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:00:29