在R语言中将时间序列日期转换为yyyy-mm格式的方法咨询
问题描述
原始时间序列数据集的dates列格式为yyyy-m(例如1933m1),需要转换为标准的yyyy-mm格式(例如1933-01)。
原始数据预览:
> head(cam_shiller) div stock dates 1 0.495 7.09 1933m1 2 0.490 6.25 1933m2 3 0.485 6.23 1933m3 4 0.480 6.89 1933m4 5 0.475 8.87 1933m5 6 0.470 10.39 1933m6
期望转换后的效果:
div stock dates 1 0.495 7.09 1933-01 2 0.490 6.25 1933-02 3 0.485 6.23 1933-03 4 0.480 6.89 1933-04 5 0.475 8.87 1933-05 6 0.470 10.39 1933-06
尝试过程中遇到的问题:
直接调用as.yearmon会导致dates列全为NA;将m替换为-后再用as.yearmon,得到的是Jan 1933这类文本格式,不符合需求。使用的代码如下:
library(zoo) cam_shiller = read.csv('https://raw.githubusercontent.com/bandcar/Examples/main/cam_shiller.csv') cam_shiller$dates = gsub('m', '-', cam_shiller$dates) cam_shiller$dates = as.yearmon(cam_shiller$dates)
解决方案
方法一:基于zoo包的时间类型转换(推荐)
此方法先将原始日期解析为时间类型,确保日期有效性,再格式化为目标格式:
library(zoo) cam_shiller <- read.csv('https://raw.githubusercontent.com/bandcar/Examples/main/cam_shiller.csv') # 指定格式解析原始日期为yearmon类型 cam_shiller$dates <- as.yearmon(cam_shiller$dates, format = "%Ym%m") # 将yearmon格式转换为yyyy-mm的字符格式 cam_shiller$dates <- format(cam_shiller$dates, "%Y-%m")
方法二:纯字符串处理
如果可以确定原始日期格式完全规范,可直接用正则表达式替换并补全月份前导零:
cam_shiller <- read.csv('https://raw.githubusercontent.com/bandcar/Examples/main/cam_shiller.csv') # 处理单个数字的月份(如m1 → -01) cam_shiller$dates <- sub("m(\\d)$", "-0\\1", cam_shiller$dates) # 处理两位数字的月份(如m10 → -10) cam_shiller$dates <- sub("m(\\d{2})$", "-\\1", cam_shiller$dates)
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

