使用 as.Date 和 tryFormats 解析不同格式的日期

Noo*_*obR 3 r as.date

我有一个带有两种不同格式("%Y-%m-%d""%m/%d/%Y")日期的变量:

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")

# [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  
# 8 Levels: 2019-04-07 2019-04-08 2019-04-09 2019-04-10 7/29/2019 7/30/2019 ... 8/1/2019
Run Code Online (Sandbox Code Playgroud)

我尝试使用as.Datewith解析日期tryFormats

df <- as.character(df)
d <- as.Date(df, tryFormats = c("%Y-%m-%d", "%m/%d/%Y"))
Run Code Online (Sandbox Code Playgroud)

它转换第一个格式结构,然后返回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"
Run Code Online (Sandbox Code Playgroud)

有什么建议?我查看了其他回复,但没有找到任何好的 tryFormats 示例/问题似乎可以解决这个问题。

akr*_*run 5

我们可以使用anydate来自anytime

library(anytime)
anydate(df)
Run Code Online (Sandbox Code Playgroud)

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


或者与lubridate

library(lubridate)
as.Date(parse_date_time(df, c("ymd", "mdy")))
Run Code Online (Sandbox Code Playgroud)


GKi*_*GKi 5

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"
Run Code Online (Sandbox Code Playgroud)