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

如何查找并统计时间序列中各段连续NA值的长度

R语言tidy风格时间序列连续NA缺口长度计算方案

核心思路

  • 基于游程编码rle()识别连续相同值片段,直接筛选NA对应片段的长度
  • 原生适配tidy生态,支持分组批量处理多时间序列,性能满足数千条序列的计算需求

单序列计算代码(匹配示例预期输出)

suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(lubridate))

# 示例数据生成
dates <- ymd("2016-01-01") + months(0:71)
fake_values <- 
  c(661,678,1094,1987,3310,2105,1452,983,1107,805,675,684,436,514,668,206,19,NA,NA,NA,1174,1760,735,366,
    510,580,939,1127,2397,1514,1370,832,NA,661,497,328,566,631,983,1876,2784,2928,2543,1508,1175,8,1733,
    862,779,1112,1446,2407,3917,2681,NA,NA,NA,NA,NA,1239,1581,2814,1419,2792,4899,5857,2450,1944,1464,1248,
    1533,NA)
df <- bind_cols(values = fake_values, dates = dates)

# 核心计算逻辑
result <- df %>%
  summarise(gap_length = list({
    rle_res <- rle(is.na(values))
    rle_res$lengths[rle_res$values]
  })) %>%
  unnest(gap_length) %>%
  rename(some_products_gaps = gap_length)

运行后得到的result与你给出的预期输出完全一致。

多序列批量扩展方案

如果需要处理数千条时间序列,仅需增加序列唯一标识列(比如产品ID、序列ID),按该列分组后执行相同逻辑即可,示例如下:

# 模拟多产品时间序列结构(product_id为序列唯一标识)
df_multi <- df %>%
  mutate(product_id = "product_1") %>%
  # 追加模拟第二条产品序列
  bind_rows(df %>% mutate(values = replace(values, 1:10, NA), product_id = "product_2"))

# 批量计算所有序列的缺口长度
multi_gap_result <- df_multi %>%
  group_by(product_id) %>%
  summarise(gap_length = list({
    rle_res <- rle(is.na(values))
    rle_res$lengths[rle_res$values]
  })) %>%
  # 如果需要保留列表格式存储各序列的缺口向量,可删除下一行unnest代码
  unnest(gap_length)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:39:01