You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:40:31