如何对每168个值的时间序列计算差值?R语言实现咨询
解决小时级累计数据的每周销量计算问题
我来帮你搞定这个每周销量计算的需求!咱们先梳理下:你有小时级的累计生产时间序列,想要计算每间隔168小时(也就是一周)的差值,得到每周总销量,公式是yweekly = y[t+167] - y[t]对吧?
先说说你原来代码的问题
你的循环写法有几个小问题,导致没法正确计算:
for (i in nrow(DT))只会循环一次,因为nrow(DT)是一个单一数值,不是连续的序列- 在for循环里手动修改
i <- i+168是没用的,for循环的i是每次从预设序列里取值,手动修改不会改变循环的步长 - 变量
j没有递增,每次都会覆盖同一个位置的数值 - 没考虑边界条件,当
i+167超过数据总行数时会报错
解决方案1:修正后的for循环
如果还是想用for循环,咱们调整一下索引逻辑:
# 初始化空向量存储结果 diff168 <- numeric() j <- 1 # 从1开始,每168步取一个起始索引,确保i+167不超过总行数 for(i in seq(1, nrow(DT)-167, by = 168)){ diff168[j] <- DT$value[i+167] - DT$value[i] j <- j + 1 }
解决方案2:更高效的向量化方法
在R里,向量化操作比for循环效率高得多,尤其是数据量大的时候,推荐用这个方法:
# 生成所有有效的起始索引(保证i+167不越界) start_indices <- seq(1, nrow(DT)-167, by = 168) # 对应的结束索引就是起始索引+167 end_indices <- start_indices + 167 # 直接计算差值,一步到位 diff168 <- DT$value[end_indices] - DT$value[start_indices]
小提示
- 确保你的数据是严格按时间顺序排列的,没有缺失的小时数据,这样每168个值刚好对应完整的一周
- 如果有缺失值,建议先做补全处理,不然计算出来的差值会不准确
内容的提问来源于stack exchange,提问作者tfkLSTM
相关产品推荐
相关产品推荐

