为什么as.Date下的tryFormats在这里不起作用?

时间:2019-12-09 18:08:08

标签: r as.date

我加载的数据集或多或少是这样的:

dput(df)
structure(1:8, .Label = c("2019-04-07", "2019-04-08", "2019-04-09", 
"2019-04-10", "7/29/2019", "7/30/2019", "7/31/2019", "8/1/2019"
), class = "factor")

我已经做到了:

df<-as.character(df)
d<-as.Date(df,tryFormats=c("%Y-%m-%d","%m/%d/%Y"))

转换第一个格式结构,但返回第二个格式结构的NA。如果我单独运行它们,它们看起来不错:

t1<-as.Date(df,format="%Y-%m-%d")
t2<-as.Date(df,format="%m/%d/%Y")

> t1
[1] "2019-04-07" "2019-04-08" "2019-04-09" "2019-04-10" NA          
[6] NA           NA           NA          
> t2
[1] NA           NA           NA           NA           "2019-07-29"
[6] "2019-07-30" "2019-07-31" "2019-08-01"

有什么建议吗?我浏览了其他答复,但没有找到似乎可以解决此问题的任何优秀tryFormats示例/问题。

3 个答案:

答案 0 :(得分:3)

我们可以使用anydate中的anytime

library(anytime)
anydate(df)

如果不存在任何格式,请使用addFormats()添加该格式,然后应用该功能


或与lubridate

library(lubridate)
as.Date(parse_date_time(df, c("ymd", "mdy")))

答案 1 :(得分:2)

tryFormats将仅选择给定格式的一个。您可以按照自己的意愿将它们分别转换。

d <- as.Date(df,format="%Y-%m-%d")
d[is.na(d)]  <- as.Date(df[is.na(d)],format="%m/%d/%Y")
d
#[1] "2019-04-07" "2019-04-08" "2019-04-09" "2019-04-10" "2019-07-29"
#[6] "2019-07-30" "2019-07-31" "2019-08-01"

答案 2 :(得分:1)

对于基本解决方案,您可以按照此answer中的说明尝试以下操作:

> df
 #[1] "2019-04-07" "2019-04-08" "2019-04-09" "2019-04-10" "7/29/2019"  "7/30/2019"  
 #"7/31/2019"  "8/1/2019" 

fmts <- c("%Y-%m-%d","%m/%d/%Y")

as.Date(apply(outer(df, fmts, as.Date),1,na.omit),'1970-01-01')
#[1] "2019-04-07" "2019-04-08" "2019-04-09" "2019-04-10" "2019-07-29" "2019-07-30" "2019-07-31" "2019-08-01"