如何使用as.POSIXlt()并解决‘字符串非标准明确格式’报错
问题
运行以下R代码时遭遇日期解析报错:
library(tidyverse) library(quantmod) library(lubridate) macro <- c("GDPC1", "CPIAUCSL","DTB3", "DGS10", "DAAA", "DBAA", "UNRATE", "INDPRO", "DCOILWTICO") rm(macro_factors) for (i in 1:length(macro)){ getSymbols(macro[i], src = "FRED") data <- as.data.frame(get(macro[i])) data$date <- as.POSIXlt.character(rownames(data)) rownames(data) <- NULL colnames(data)[1] <- "macro_value" data$quarter <- as.yearqtr(data$date) data$macro_ticker <- rep(macro[i], dim(data)[1]) data <- data%>% mutate(date = ymd(date))%>% group_by(quarter)%>% top_n(1,date) %> filter(date >= "1980-01-01", date <= "2019-12-31") %> if(i == 1){macro_factors <- data} else {macro_factors <- rbind(macro_factors, data)} }
报错信息:
Error in as.POSIXlt.character(rownames(data)) : character string is not in a standard unambiguous format
尝试过用as.POSIXct()转换,先转数值型也无效,确认日期为“年-月-日”格式字符型,仍无法解决问题。
解决方法
1. 替换日期解析方式
as.POSIXlt.character对部分FRED数据的行名兼容性较差,直接用lubridate包的ymd()函数解析行名,稳定性更高,且和后续日期处理逻辑统一:
将代码中的data$date <- as.POSIXlt.character(rownames(data))替换为:
data$date <- ymd(rownames(data))
2. 修复管道符语法错误
原代码中多处管道符%>%漏写了末尾的百分号(如top_n(1,date) %>),这会导致语法错误,必须补全为完整的%>%。
3. 调整数据合并逻辑
不要在管道链内嵌入if判断,管道链应返回数据对象,将合并逻辑移至管道操作外部,同时提前初始化空数据框避免报错:
修改后的完整可运行代码:
library(tidyverse) library(quantmod) library(lubridate) macro <- c("GDPC1", "CPIAUCSL","DTB3", "DGS10", "DAAA", "DBAA", "UNRATE", "INDPRO", "DCOILWTICO") # 提前初始化空数据框 macro_factors <- data.frame() for (i in 1:length(macro)){ getSymbols(macro[i], src = "FRED", auto.assign = TRUE) data <- as.data.frame(get(macro[i])) # 用lubridate解析日期行名 data$date <- ymd(rownames(data)) rownames(data) <- NULL colnames(data)[1] <- "macro_value" data$quarter <- as.yearqtr(data$date) data$macro_ticker <- rep(macro[i], nrow(data)) # 完整管道处理数据,修复管道符并取消分组 data_processed <- data %>% group_by(quarter) %>% top_n(1, date) %>% filter(date >= ymd("1980-01-01"), date <= ymd("2019-12-31")) %>% ungroup() # 合并数据 if(i == 1){ macro_factors <- data_processed } else { macro_factors <- rbind(macro_factors, data_processed) } }
额外优化点
- 添加
auto.assign = TRUE明确getSymbols的赋值行为,避免潜在的环境变量问题 - 分组处理后用
ungroup()取消分组,防止后续合并或操作时出现分组相关异常 - 日期过滤时用
ymd()将字符串转为日期类型,比直接使用字符串对比更严谨
内容的提问来源于stack exchange,提问作者Chern Hong Pang
相关产品推荐
相关产品推荐

