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

R语言调用Prophet库时as.POSIXct报错:需提供origin参数

问题:R中调用Prophet库时日期格式转换报错

核心报错信息

Error in as.POSIXct.numeric(ds, format = "%Y-%m-%d", tz = "GMT") : 'origin' must be supplied

传递的输入数组

arr <- c('2022-09-27','1','2022-09-28','2','2022-09-29','3','2022-09-30','2')

调用Prophet的函数代码

ptmForecastTest <- function(nrows, ncols, prophetUncertaintyInterval, values, periods, freq){
  value_mat <- matrix(values, nrow=4, ncol=2, byrow=TRUE)
  df <- as.data.frame(value_mat)
  colnames(df) <- c('ds', 'y')
  model <- prophet(df, 0.8, growth='linear')
  return(df)
}

代码执行到model <- prophet(df, 0.8, growth='linear')时中断,Prophet无法识别生成的DataFrame。

尝试单独转换日期格式时的新报错

测试代码:

values <- c("2022-09-06 23:45:50",1,"2022-09-07 23:45:50",2,"2022-09-08 23:45:50",3,"2022-09-09   23:45:60",2) 
val_mat <- matrix(values,4,2,byrow=TRUE) 
df <- as.data.frame(val_mat) 
colnames(df) <- c('ds','y') 
as.POSIXct(df['ds'], format = "%Y-%m-%d %H:%M:%S")

触发报错:

Error in as.POSIXct.default(df["ds"], format = "%Y-%m-%d %H:%M:%S") : do not know how to convert 'df["ds"]' to class “POSIXct”

已尝试lubridate包相关方法,问题仍未解决。


解决方案

问题根源

  1. 用matrix()转换数组后生成的是字符型矩阵,转成DataFrame后ds和y列均为字符类型,而Prophet要求ds必须是日期/时间类型,y必须是数值类型。
  2. 单独转换时用df['ds']得到的是数据框对象,但as.POSIXct仅接受向量输入,因此报错。

修正步骤

1. 修复函数内的列类型转换

在生成DataFrame后,先将ds转为日期类型、y转为数值类型,同时修正Prophet的参数传递方式:

ptmForecastTest <- function(nrows, ncols, prophetUncertaintyInterval, values, periods, freq){
  value_mat <- matrix(values, nrow=4, ncol=2, byrow=TRUE)
  # 禁用因子转换,避免字符自动转为因子
  df <- as.data.frame(value_mat, stringsAsFactors = FALSE)
  colnames(df) <- c('ds', 'y')
  
  # 转换列类型:ds转POSIXct,y转数值
  df$ds <- as.POSIXct(df$ds, format = "%Y-%m-%d", tz = "GMT")
  df$y <- as.numeric(df$y)
  
  # 明确指定参数名,避免位置参数错位
  model <- prophet(df, uncertainty.interval = prophetUncertaintyInterval, growth='linear')
  return(df)
}

2. 单独测试日期转换的正确写法

提取ds列的向量而非数据框,同时修正无效的秒数(时间字符串中秒数需为0-59):

values <- c("2022-09-06 23:45:50",1,"2022-09-07 23:45:50",2,"2022-09-08 23:45:50",3,"2022-09-09   23:45:50",2) 
val_mat <- matrix(values,4,2,byrow=TRUE) 
df <- as.data.frame(val_mat, stringsAsFactors = FALSE) 
colnames(df) <- c('ds','y') 

# 提取向量进行转换
df$ds <- as.POSIXct(df$ds, format = "%Y-%m-%d %H:%M:%S", tz = "GMT")
df$y <- as.numeric(df$y)

关键注意点

  • 时间字符串中的秒数必须在0-59范围内,测试代码里的23:45:60是无效时间,会导致转换失败,需修正。
  • Prophet的uncertainty.interval参数需明确指定参数名,不能直接传数值,否则会被识别为changepoint.prior.scale参数,引发参数错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:30:34