如何将R语言时间序列ts的日期转换为数据框可识别的标准日期格式
问题原因
你遇到的问题来自两个错误的使用方式:
ts()的start参数不支持直接传入Date类型值:你传入的min(index.date$start.date)会被默认转换为1970年以来的天数数值(2016-01-01对应数值为16801),ts()会将其解析为「第16801年的第1个周期」,和你预期的2016年完全不符。time(ts)返回值的单位和as.Date()默认的解析单位不匹配:time(ts)返回的是年份浮点值(比如2016年第1周为2016,第2周为2016+1/52),而as.Date()默认将传入的数值识别为「1970-01-01以来的天数」,二者单位完全不匹配,自然会返回1970年附近的错误日期。
最简解决方案
你已经提前生成了完全符合要求的index.date日期序列,不需要从ts对象中反推日期,直接绑定数值即可:
# 直接用提前生成的正确日期序列,和ts的数值拼接即可 output.df <- data.frame( date = index.date$start.date, y = as.numeric(weekly.ts) )
如果你需要从ts对象中转换日期的通用方法
如果没有提前生成日期序列,可以按如下方式转换:
library(lubridate) # 提取ts的时间浮点值 ts_time <- as.numeric(time(weekly.ts)) # 拆分年份和周数 year <- floor(ts_time) week_of_year <- round((ts_time - year) * 52) # 拼接转换为日期,这里指定每周第一天为周一,可根据需求调整 output.df <- data.frame( date = parse_date_time(paste(year, week_of_year, 1), orders = "Y W w"), y = as.numeric(weekly.ts) )
注意:base R的
ts对周度数据的支持存在天然缺陷(每年实际周数可能是52或53周,固定frequency=52会出现日期偏移),如果频繁处理周度时间序列更推荐使用xts或tsibble包,不需要手动处理日期转换问题。
内容的提问来源于stack exchange,提问作者Yolo_chicken
相关产品推荐
相关产品推荐

