通过r中的索引解析多个日期格式



我试图根据它们在日期向量中的位置解析多个日期格式。在某些情况下,数据将使用的格式从y/m/d转换为y/d/m。对于像2010/07/03这样指定润滑顺序的日期来说,这很烦人。

这是一个日期的例子

datevec <- c("2011/07/01", "2011/07/02", "2011/07/03", "2011/02/07" )

日期设置,所以在某一行日期是一种格式和另一行日期是另一种格式之后,所以我试图提供一个索引函数当我尝试使用this +lubridate解析它们时,它只返回3个日期。

lapply(datevec, function(x, i) ifelse( x[i] <4,  parse_date_time(x, "%Y-%m-%d"), parse_date_time(x,"%Y-%d-%m" )) )

1)如果我们将问题中的ifelse改为普通的If,那么问题中的基本思想经过适当的修改就可以工作了。注意,它给出了一个列表L,所以假设我们真的想要一个向量,我们添加最后一行代码。

f <- function(x, i) if (i < 4) 
parse_date_time(x, "ymd") else parse_date_time(x, "ydm")
L <- Map(f, datevec, seq_along(datevec), USE.NAMES = FALSE)
do.call("c", L)
## [1] "2011-07-01 UTC" "2011-07-02 UTC" "2011-07-03 UTC" "2011-02-07 UTC"

2)在格式部分使用ifelse而不是日期部分,并使用as。日期而不是parse_date_time:

ix <- seq_along(datevec)
as.Date(datevec, ifelse(ix < 4, "%Y/%m/%d", "%Y/%d/%m"))
## [1] "2011-07-01" "2011-07-02" "2011-07-03" "2011-07-02"

3)使用ymd转换前3个,使用ydm转换其余的,然后连接。

c(ymd(head(datevec, 3)), ydm(tail(datevec, -3)))
## [1] "2011-07-01" "2011-07-02" "2011-07-03" "2011-07-02"

4)

c(as.Date(head(datevec, 3)), as.Date(tail(datevec, -3), "%Y/%d/%m"))
## [1] "2011-07-01" "2011-07-02" "2011-07-03" "2011-07-02"

5)另一种方法是使用字符串操作转换后面的日期,以便所有日期都采用相同的格式,然后使用as。日期或年月日:

ix <- seq_along(datevec)
swap <- sub("(..)/(..)$", "\2/\1", datevec)
as.Date(ifelse(ix < 4, datevec, swap))
## [1] "2011-07-01" "2011-07-02" "2011-07-03" "2011-07-02"

6)上面的代码返回Date类,它更适合没有时间的日期,但如果由于某种原因您确实需要POSIXct,则使用as。或者像这样使用parse_date_time:

c(parse_date_time(head(datevec, 3), "ymd"), parse_date_time(tail(datevec, -3), "ydm"))
## [1] "2011-07-01 UTC" "2011-07-02 UTC" "2011-07-03 UTC" "2011-07-02 UTC"

最新更新