R - 将字符串转换为日期
R - Convert strings to dates
我有一个存储为字符串的日期列表,我想将它们转换为日期格式。我面临两个主要问题:
- 月-日-年分隔符不一致:有时是
_
,有时是-
。
- 字符串中月份和日期的位置不一致:有时日期在月份之前,有时则相反。
我想知道是否有一种方法可以编写 regex
以便将下面的三个字符串都转换为日期。
> mydate <- c('Jan_30_2018','April_3-2018','07_June_2018')
> as.Date(mydate,'%B_%d_%Y')
[1] "2018-01-30" NA NA
> as.Date(mydate,'%B.%d.%Y')
[1] NA NA NA
> as.Date(mydate,'%B*%d*%Y')
[1] NA NA NA
> as.Date(mydate,'%B+%d+%Y')
[1] NA NA NA
> as.Date(mydate,'%B_%d-%Y')
[1] NA "2018-04-03" NA
as.Date(ifelse(grepl("^[A-Z]",mydate),
as.Date(gsub("_","-",mydate), "%B-%d-%Y"),
as.Date(gsub("_","-",mydate), "%d-%B-%Y")
), origin="1970-01-01")
[1] "2018-01-30" "2018-04-03" "2018-06-07"
更新
这种方法提供了一些不错的速度,以防您的向量 mydate
具有任何合理的大小:
library(data.table)
data.table(d=gsub("_","-",mydate))[
, fifelse(grepl("^[A-Za-z]",d),as.Date(d,"%B-%d-%Y"), as.Date(d,"%d-%B-%Y"))]
正如 @rawr 在一个小时前的评论中所暗示的那样,我的 anytime package 中的 anydate()
函数就是为此而创建的:
- 不需要格式字符串,但会检查一些可能且合理的格式
- 不需要向量的所有元素都使用相同的格式
- 确实使用矢量化和编译操作,所以速度很快
例子
> anytime::anydate(c('Jan_30_2018','April_3-2018','07_June_2018'))
[1] "2018-01-30" "2018-04-03" "2018-06-07"
>
我有一个存储为字符串的日期列表,我想将它们转换为日期格式。我面临两个主要问题:
- 月-日-年分隔符不一致:有时是
_
,有时是-
。 - 字符串中月份和日期的位置不一致:有时日期在月份之前,有时则相反。
我想知道是否有一种方法可以编写 regex
以便将下面的三个字符串都转换为日期。
> mydate <- c('Jan_30_2018','April_3-2018','07_June_2018')
> as.Date(mydate,'%B_%d_%Y')
[1] "2018-01-30" NA NA
> as.Date(mydate,'%B.%d.%Y')
[1] NA NA NA
> as.Date(mydate,'%B*%d*%Y')
[1] NA NA NA
> as.Date(mydate,'%B+%d+%Y')
[1] NA NA NA
> as.Date(mydate,'%B_%d-%Y')
[1] NA "2018-04-03" NA
as.Date(ifelse(grepl("^[A-Z]",mydate),
as.Date(gsub("_","-",mydate), "%B-%d-%Y"),
as.Date(gsub("_","-",mydate), "%d-%B-%Y")
), origin="1970-01-01")
[1] "2018-01-30" "2018-04-03" "2018-06-07"
更新
这种方法提供了一些不错的速度,以防您的向量 mydate
具有任何合理的大小:
library(data.table)
data.table(d=gsub("_","-",mydate))[
, fifelse(grepl("^[A-Za-z]",d),as.Date(d,"%B-%d-%Y"), as.Date(d,"%d-%B-%Y"))]
正如 @rawr 在一个小时前的评论中所暗示的那样,我的 anytime package 中的 anydate()
函数就是为此而创建的:
- 不需要格式字符串,但会检查一些可能且合理的格式
- 不需要向量的所有元素都使用相同的格式
- 确实使用矢量化和编译操作,所以速度很快
例子
> anytime::anydate(c('Jan_30_2018','April_3-2018','07_June_2018'))
[1] "2018-01-30" "2018-04-03" "2018-06-07"
>