【发布时间】:2017-01-07 07:37:13
【问题描述】:
我错过了什么吗?我不知道如何将以下内容转换为Dates,其中月份中的某天 (%d) 具有序号后缀-st、-nd、-rd、-th:
ord_dates <- c("September 1st, 2016", "September 2nd, 2016",
"September 3rd, 2016", "September 4th, 2016")
?strptime 似乎没有列出序数后缀的简写,并且不会自动处理:
as.Date(ord_dates, format = c("%B %d, %Y"))
#[1] NA NA NA NA
在format 参数中是否有处理被忽略字符的标记?我丢失的令牌?
我能想到的最好办法是(可能有一个更短的正则表达式,但同样的想法):
as.Date(gsub("([0-9]+)(st|nd|rd|th)", "\\1", ord_dates), format = "%B %d, %Y")
# [1] "2016-09-01" "2016-09-02" "2016-09-03" "2016-09-04"
看来这类数据应该比较常见;我错过了什么吗?
【问题讨论】:
-
这是一个较短的正则表达式:
as.Date(sub("([0-9]+).*,", "\\1", ord_dates), format = c("%B %d %Y")) -
嗯,我不是正则表达式专家,但我想它应该是,当字符串很长并且第一个匹配在字符串的早期(所以它不必遍历其余部分)。
-
关于你可以在 base 中做的最简单的事情:
as.Date(sub('\\D+,', '', ord_dates), '%B %e %Y')。格式字符串中不是标记的所有内容都被视为文字(%%除外,它被视为文字%),因此非常令人沮丧的是没有通配符。