R语言中含3字符月份的日期字符串转Date类方法
解决R中将特殊格式日期字符串转为Date/POSIXct类的问题
你的问题核心是格式字符串用错了匹配规则:你用了%m(匹配数字形式的月份,比如07),但你的日期里是英文月份缩写(比如JUL),所以应该用%b来匹配缩写的月份名称。另外你的字符串前有空格,格式串里要对应上,或者先清理空格。
下面是几种可行的解决方案:
方法1:直接使用正确的格式符并忽略大小写
你的月份缩写是全大写的,R默认的%b匹配首字母大写的月份,加上ignore.case=TRUE参数就能兼容全大写的情况,同时格式串里要包含开头的空格:
dates <- c(" 26JUL2018:23:59:59", " 02APR2018:23:59:59", " 02MAY2018:23:59:59", " 22APR2018:23:59:59", " 27MAY2018:23:59:59", " 04MAR2018:23:59:59", " 10APR2018:23:59:59", NA, " 04SEP2018:23:59:59", " 21APR2017:23:59:59" ) # 转换为带时间的POSIXct类型 posix_dates <- as.POSIXct(dates, format=" %d%b%Y:%H:%M:%S", ignore.case=TRUE) posix_dates
执行后输出:
[1] "2018-07-26 23:59:59 UTC" "2018-04-02 23:59:59 UTC" "2018-05-02 23:59:59 UTC" [4] "2018-04-22 23:59:59 UTC" "2018-05-27 23:59:59 UTC" "2018-03-04 23:59:59 UTC" [7] "2018-04-10 23:59:59 UTC" NA "2018-09-04 23:59:59 UTC" [10] "2017-04-21 23:59:59 UTC"
方法2:先清理空格再转换
如果觉得格式串里的空格不够直观,可以先用trimws()去掉字符串首尾的空格,再用更简洁的格式串:
clean_dates <- trimws(dates) posix_dates <- as.POSIXct(clean_dates, format="%d%b%Y:%H:%M:%S", ignore.case=TRUE)
方法3:如果只需要日期部分(不含时分秒)
如果不需要保留时间信息,可以用as.Date(),格式串简化为对应的日期部分:
date_only <- as.Date(dates, format=" %d%b%Y", ignore.case=TRUE) # 或者清理空格后: date_only <- as.Date(trimws(dates), format="%d%b%Y", ignore.case=TRUE)
注意事项:系统Locale的影响
如果你的系统默认Locale不是英文,可能会导致%b无法识别英文月份缩写。这种情况下可以临时切换到英文Locale,转换完成后再恢复:
# 保存当前Locale old_locale <- Sys.getlocale("LC_TIME") # 切换到英文Locale Sys.setlocale("LC_TIME", "C") # 执行转换 posix_dates <- as.POSIXct(dates, format=" %d%b%Y:%H:%M:%S", ignore.case=TRUE) # 恢复原Locale Sys.setlocale("LC_TIME", old_locale)
内容的提问来源于stack exchange,提问作者icedcoffee
相关产品推荐
相关产品推荐

