如何从R的ts/mts时间序列对象中提取日期行名
如何提取R中ts/mts类型时间序列对象打印时显示的日期行名
问题原因
ts/mts类型的时间序列对象本身不存储显式的行名字段,控制台打印时看到的Jan 1969这类日期标签,是R的打印方法根据对象内置的时间属性(起始时间、结束时间、观测频率)动态生成的,因此直接调用rownames()、row.names()这类常规行名提取函数只会返回NULL。
以R内置的Seatbelts数据集为例,常规方法失效的复现代码如下:
class(Seatbelts) #> [1] "mts" "ts" # 直接打印可看到日期行标签 Seatbelts #> DriversKilled drivers front rear kms PetrolPrice VanKilled law #> Jan 1969 107 1687 867 269 9059 0.10297181 12 0 #> Feb 1969 97 1508 825 265 7685 0.10236300 6 0 #> Mar 1969 102 1507 806 319 9963 0.10206249 12 0 ... # 取0列子集依然能看到日期标签,但提取不到行名 Seatbelts[,0] #> #> Jan 1969 #> Feb 1969 #> Mar 1969 ... rownames(Seatbelts) #> NULL row.names(Seatbelts) #> NULL row.names(as.matrix(Seatbelts)) #> NULL
可行方案
核心逻辑是先提取ts对象内置的时间索引,再格式化为和打印效果一致的日期标签,两种常用实现如下:
方案1:借助zoo包快速实现(输出格式完全匹配打印效果)
zoo是R生态中常用的时间序列处理包,可一步完成时间索引提取和格式化,输出结果和控制台打印的日期标签完全一致:
# 加载zoo包,若未安装可先运行 install.packages("zoo") library(zoo) # 提取时间索引并格式化为"月缩写 年"的格式 date_labels <- format(as.yearmon(time(Seatbelts)), "%b %Y") # 验证结果 head(date_labels) #> [1] "Jan 1969" "Feb 1969" "Mar 1969" "Apr 1969" "May 1969" "Jun 1969"
方案2:基础R实现,无第三方包依赖
如果不想安装加载扩展包,用R基础函数即可实现相同效果:
# 提取ts对象的数值型时间索引 ts_index <- as.POSIXlt(time(Seatbelts)) # 分别提取月份缩写、年份,拼接为目标格式 date_labels_base <- paste( month.abb[ts_index$mon + 1], # POSIXlt中mon取值为0-11,对应1-12月,需偏移1位 ts_index$year + 1900 # POSIXlt中year存储的是距1900年的偏移值,需加回1900 ) # 验证结果 head(date_labels_base) #> [1] "Jan 1969" "Feb 1969" "Mar 1969" "Apr 1969" "May 1969" "Jun 1969"
提示:如果处理的是季度、日度、年度频率的ts对象,只需要调整格式化规则,即可得到对应频率的日期标签,核心都是通过
time(ts对象)获取内置时间索引,不需要捕获控制台打印输出做文本解析。
内容的提问来源于stack exchange,提问作者geotheory
相关产品推荐
相关产品推荐

