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

如何在R中将非全天覆盖的半小时间隔数据转换为时间序列对象?

解答你的时间序列建模疑问

Hey there! No worries at all about it being your first question—we’ve all been there 😊 Let’s break down your problem step by step:

1. 如何设置ts()的frequency参数?

你的数据是每30分钟一个观测,每天固定有24个数据点(8:00-20:00,共12小时),且有3个月的多日样本。对于ts()函数来说,frequency指的是每个周期内的观测数量。这里你的周期是“一天”,每个周期内有24个有效观测,所以直接设置frequency = 24就可以了:

# 假设你的menge数据是按时间顺序排列的多日序列
drink_ts <- ts(df$menge, frequency = 24)

这个设置会让R识别到每连续24个数据点对应一天的8:00-20:00时段,完美匹配你的数据结构。

2. 是否需要添加0值覆盖全天?

我的建议是不需要,除非你的业务逻辑要求必须考虑20:00-次日8:00的饮水情况:

  • 你要预测的是“截至晚8点的总饮水量”,非观测时段(夜间)本身不在你的目标范围内,强行添加0值会引入无意义的噪声,反而可能干扰Croston模型对有效时段饮水模式的学习。
  • Croston方法本身就是为处理间歇需求序列(即存在大量0值的序列)设计的,如果你的8:00-20:00数据中已经有很多“无饮水”的0值,模型完全可以处理这些情况,不需要额外补全天的0。

3. 更优的处理方案

除了基础的ts(),还有几个方案可以让你的建模更灵活:

  • 用xts/zoo处理带时间戳的序列:这类包可以直接绑定观测的具体时间戳,比ts()更直观,尤其适合你需要“基于前1-2个时间步预测全天”的场景,筛选时间窗口会更方便:
    library(xts)
    # 假设你有一列datetime记录每个观测的具体时间(如"2024-01-01 08:00:00")
    drink_xts <- xts(df$menge, order.by = df$datetime)
    # 提取某一天前2个时间步的数据
    first_two <- window(drink_xts, start = as.POSIXct("2024-01-01 08:00"), end = as.POSIXct("2024-01-01 08:30"))
    
  • 结合回归模型预测单日总饮水量:如果你的核心目标是预测单日总饮水量,而非每个时间步的饮水情况,也可以尝试构建特征(比如前1-2个时间步的饮水量、日期类型、天气等),用线性回归或树模型来直接预测单日总和,这种方法可能比纯时间序列更直接高效。
  • 用forecast包的croston()函数:R的forecast包已经实现了Croston方法,不管你用ts还是xts对象,都可以轻松调用。如果用ts对象,直接传入设置好frequency的序列即可:
    library(forecast)
    croston_model <- croston(drink_ts)
    # 预测当天剩余22个时间步的饮水量
    croston_forecast <- forecast(croston_model, h = 22)
    

希望这些建议能帮到你,要是还有细节问题,随时补充提问就好!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:27:47