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包相关方法,问题仍未解决。
解决方案
问题根源
- 用
matrix()转换数组后生成的是字符型矩阵,转成DataFrame后ds和y列均为字符类型,而Prophet要求ds必须是日期/时间类型,y必须是数值类型。 - 单独转换时用
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
相关产品推荐
相关产品推荐

