R语言:用ts()将data.frame转时间序列后日期显示为数字的解决方法
解决R中ts()转换data.frame时日期变数字的问题
首先得明确:ts()函数是专门用来处理等时间间隔的时间序列,它根本不识别Date类型,会把日期直接转成底层的数值(也就是从1970-01-01开始算的天数),所以直接用ts()转整个带日期的data.frame肯定会出问题。而且你的示例数据日期间隔还不一致,这种非等间隔的序列,ts()本身就不是合适的工具,推荐用以下两种方案:
方案1:用zoo包创建带日期索引的时间序列
zoo包支持非等间隔的时间序列,能直接保留日期作为索引:
# 先安装并加载zoo包 install.packages("zoo") library(zoo) row_data <- data.frame(mydate=as.Date(c('2013-1-1','2023-1-6','2023-1-20')), amount = c(1,7,8)) # 创建zoo对象,指定日期为索引,amount为数值列 zoo_ts <- zoo(row_data$amount, order.by = row_data$mydate) print(zoo_ts)
输出会直接显示日期和对应数值,不会把日期转成数字。
方案2:如果一定要用ts对象(仅适合等间隔序列)
如果你的数据是等间隔的(比如每月、每日固定间隔),可以先把日期转成ts的起始时间和频率,再单独转换数值列:
比如假设你的数据是每日等间隔(示例里不是,这里举个正确的例子):
row_data <- data.frame(mydate=seq(as.Date('2023-01-01'), as.Date('2023-01-03'), by = "day"), amount = c(1,7,8)) # 转换为ts对象,指定起始日期的年份、月份、日期,频率为365(按日) ts_data <- ts(row_data$amount, start = c(year(row_data$mydate[1]), month(row_data$mydate[1]), day(row_data$mydate[1])), frequency = 365) # 查看时可以把ts对象转回带日期的格式 data.frame(mydate = as.Date(start(ts_data)) + 0:(length(ts_data)-1), amount = as.vector(ts_data))
但注意:如果你的数据间隔不规则,别硬用ts,不然会丢失时间信息或者强制补全数据,反而麻烦。
总结
- 非等间隔时间序列:优先用zoo/xts包,直接保留日期索引
- 等间隔时间序列:用ts时单独处理数值列,通过start和frequency参数指定时间信息,不要直接转整个data.frame
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

