如何在R中通过排除右侧6位字符的方式从特殊格式日期字符串中提取月份
解决方案
你之前的写法错误原因很明确:代码中加入的!是R中的逻辑非运算符,会先将你的日期字符串向量强制转为逻辑值,完全偏离了提取子串的需求,因此不会生效。
直接按截取需求实现
你要排除字符串最右侧6位,直接指定子串的结束位置为倒数第7位即可,代码如下:
library(stringi) df$month <- stri_sub(df$date, to = -7)
效果验证:
- 对于长度为7位的日期值(如
1012003),取到倒数第7位就是第1位字符,得到月份1 - 对于长度为8位的日期值(如
12172003),取到倒数第7位就是前2位字符,得到月份12
完全符合你的需求。
更稳妥的全量日期解析方案
如果后续需要频繁提取日期相关字段,建议直接统一格式解析为日期类型,避免多次截取出错:
library(stringi) # 先把日期字符串补前导零到8位,统一为月2位+日2位+年4位的标准格式 df$date_pad <- stri_pad_left(df$date, width = 8, pad = "0") # 直接按“月日年”格式解析为日期类型 df$date_parsed <- as.Date(df$date_pad, format = "%m%d%Y") # 后续可以按需提取任意时间组件,示例如下: library(lubridate) df$month <- month(df$date_parsed) # 提取月份 df$day <- day(df$date_parsed) # 提取日期 df$year <- year(df$date_parsed) # 提取年份
内容的提问来源于stack exchange,提问作者user35131
相关产品推荐
相关产品推荐

