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

如何高效计算出入口累计计数时间序列的水平时延?

问题描述

现有某区域出入口的两组累计计数时间序列:序列间垂直间距代表该区域瞬时占用率,水平间距代表平均停留时长。真实数据为1分钟分辨率(每分钟均有观测值),需要针对2105序列的每个点,计算2081序列上首个具有相同y值的线性插值点的时间差(分钟数)。

原方案采用dplyr::complete+zoo::na.approx插值后非等值连接,但面对20个传感器、200天的1分钟数据时效率极低,需更高效的实现方式。

序列可视化

# 使用文末定义的df1绘制序列图
ggplot(df1, aes(datetime, cuml, color = label)) + 
  geom_line() +   
  geom_point()

两组累计计数时间序列图


高效解决方案

核心思路:避免全量插值,直接针对目标序列的每个点,在参考序列的区间内做线性插值计算对应时间,无需生成全量分钟级数据,大幅降低计算量。

步骤1:拆分并整理序列

先将数据拆分为目标序列(2105)和参考序列(2081),并确保参考序列按时间排序:

library(dplyr)

# 拆分目标序列与参考序列
target <- df1 %>% filter(label == "2105 Line 0-exit") %>% arrange(datetime)
ref <- df1 %>% filter(label == "2081 Line 0-exit") %>% arrange(datetime)

步骤2:区间匹配+线性插值计算时间差

为每个目标点匹配参考序列的相邻区间,通过线性插值计算对应时间,最后得出时间差:

target_matched <- target %>%
  mutate(
    # 找到当前cuml在参考序列中的区间位置
    ref_pos = findInterval(cuml, ref$cuml),
    # 处理边界情况:cuml超出参考序列范围时取首尾区间
    ref_pos = case_when(
      ref_pos == 0 ~ 1,
      ref_pos == nrow(ref) ~ nrow(ref)-1,
      TRUE ~ ref_pos
    ),
    # 获取区间的上下限参考点
    ref_lower_cuml = ref$cuml[ref_pos],
    ref_upper_cuml = ref$cuml[ref_pos+1],
    ref_lower_time = ref$datetime[ref_pos],
    ref_upper_time = ref$datetime[ref_pos+1],
    # 线性插值计算对应时间
    ref_interp_time = ref_lower_time + 
      (cuml - ref_lower_cuml) / (ref_upper_cuml - ref_lower_cuml) * 
      (ref_upper_time - ref_lower_time),
    # 计算时间差(转换为分钟)
    time_diff_mins = as.numeric(difftime(ref_interp_time, datetime, units = "mins"))
  )

方案优势

  • 效率极高:仅针对目标序列的点做区间匹配和插值,计算量随目标点数量线性增长,适配大样本场景
  • 逻辑简洁:直接围绕核心需求实现,无冗余操作
  • 边界兼容:处理了目标值超出参考序列范围的情况,保证计算稳定性

结果预览

查看核心计算结果:

target_matched %>% select(datetime, cuml, ref_interp_time, time_diff_mins)

示例数据
df1 <- structure(list(datetime = structure(c(1670152500, 1670152500, 
  1670154300, 1670156100, 1670156100, 1670157900, 1670157900, 1670159700, 
  1670159700, 1670161500, 1670161500, 1670163300, 1670163300, 1670165100, 
  1670165100, 1670166900, 1670166900, 1670168700, 1670168700, 1670170500, 
  1670170500, 1670172300, 1670172300, 1670174100, 1670174100, 1670175900, 
  1670175900), tzone = "UTC", class = c("POSIXct", "POSIXt")), 
    label = c("2081 Line 0-exit", "2105 Line 0-exit", "2105 Line 0-exit", 
    "2081 Line 0-exit", "2105 Line 0-exit", "2081 Line 0-exit", 
    "2105 Line 0-exit", "2105 Line 0-exit", "2081 Line 0-exit", 
    "2105 Line 0-exit", "2081 Line 0-exit", "2081 Line 0-exit", 
    "2105 Line 0-exit", "2105 Line 0-exit", "2081 Line 0-exit", 
    "2081 Line 0-exit", "2105 Line 0-exit", "2105 Line 0-exit", 
    "2081 Line 0-exit", "2105 Line 0-exit", "2081 Line 0-exit", 
    "2105 Line 0-exit", "2081 Line 0-exit", "2105 Line 0-exit", 
    "2081 Line 0-exit", "2081 Line 0-exit", "2105 Line 0-exit"
    ), cuml = c(8.30121553513193, 96.9773299748111, 244.892247411139, 
    213.756300029647, 418.275958578226, 420.249036466054, 636.719843268962, 
    883.57122865939, 637.118292321376, 1137.27959697733, 891.343018084791, 
    1178.77260598873, 1388.04925832634, 1725.02099076406, 1407.05603320486, 
    1710.05040023718, 2025.74867058494, 2349.00643716765, 2043.13667358435, 
    2668.34592779177, 2346.13104061666, 2935.76826196474, 2649.12540764898, 
    3198.29275118948, 2988.43759264749, 3285.20604802846, 3421.63448082844
    )), row.names = c(NA, -27L), class = c("tbl_df", "tbl", "data.frame"
))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:15:34