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

如何为分组tsibble按组填充指定时间范围的缺失间隔

按组自定义起止时间填充tsibble的缺失时间间隔

问题核心

处理多分组的tsibble时,若每个分组有独立的时间起止范围,直接将起止时间列传入fill_gaps()的.start/.end参数会报错——因为这两个参数仅支持标量值,无法识别分组内的列变量。需要实现按组自动读取起止时间,批量完成缺失间隔填充。

解决方案

利用group_modify()对每个分组单独执行fill_gaps(),在分组内提取起止时间的标量值传入参数,即可实现按组填充对应时间范围的缺失间隔。

完整代码示例

library(tidyverse)
library(tsibble)

N <- 10
set.seed(42)

d       <- as_datetime("2023-03-08 08:00:00")
times   <- d + seconds(unique(round(sort(runif(N, min = 0, max = 36e3)))))
nObs    <- 1 + rpois(length(times), lambda = 1)
birdIdx <- 1 + round(runif(length(times)))
birds   <- c("Duck", "Goose")[birdIdx]

waterfowl <- tibble(Timestamp = times, Count = nObs, Bird = as_factor(birds))

# 聚合为30分钟间隔的分组tsibble
waterfowl |> 
  as_tsibble(index = Timestamp) |> 
  group_by(Bird) |> 
  index_by(Interval = floor_date(Timestamp, "30 minute")) |> 
  summarize(`Total birds` = sum(Count)) -> waterfowlSumm

# 为每个分组添加自定义起止时间(实际场景可替换为按组计算的起止,比如min/max Timestamp)
waterfowl_with_range <- waterfowlSumm |>
  mutate(
    Start = d,
    End = d + hours(9) + minutes(30)
  )

# 按组填充缺失间隔
waterfilled <- waterfowl_with_range |>
  group_modify(function(.x, .y) {
    fill_gaps(
      .x,
      `Total birds` = 0,
      .start = .x$Start[1],
      .end = .x$End[1]
    )
  }) |>
  select(-Start, -End) # 按需保留或删除起止时间列

# 查看结果
waterfilled

关键说明

  • group_modify()会遍历每个分组,将分组数据(.x)和分组键(.y)传入自定义函数
  • 在分组函数内,通过.x$Start[1]和.x$End[1]提取该分组的起止时间标量,满足fill_gaps()的参数要求
  • 若起止时间是从原始数据按组计算(比如每个Bird的最早/最晚观测时间),可在添加起止列时用mutate(Start = min(Timestamp), End = max(Timestamp))替换硬编码值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:10:23