如何在大数据框中转换为日期时指定日期和月份丢失的日期和月份

时间:2018-06-12 19:17:09

标签: r date lubridate

我有一个超过10万行的大日期框架。日期列包含多种格式的日期,例如"%m/%d/%Y""%Y-%m""%Y""%Y-%m-%d"。我可以将这些全部转换为parse_date_time()的{​​{1}}日期。

lubridate

但正如您所看到的,这会将缺少日期的日期设置为当月的第一天,并将缺少月份和日期的日期设置为一年中的第一天。我怎样才能将它们分别设置为15日和6月15日?

2 个答案:

答案 0 :(得分:1)

使用nchar检查日期向量和paste缺少的内容。

library(lubridate)

dates <- c("05/10/1983","8/17/2014","1953-12","1975","2001-06-17")


dates <- ifelse(nchar(dates) == 4, paste(dates, "06-15", sep = "-"),
             ifelse(nchar(dates) == 7, paste(dates, 15, sep = "-"), dates))
dates
#[1] "05/10/1983" "8/17/2014"  "1953-12-15" "1975-06-15"
#[5] "2001-06-17"

parse_date_time(dates, orders = c("%m/%d/%Y","%Y-%m","%Y","%Y-%m-%d"))
#[1] "1983-05-10 UTC" "2014-08-17 UTC" "1953-12-15 UTC"
#[4] "1975-06-15 UTC" "2001-06-17 UTC"

另一种解决方案是使用索引向量,也基于nchar

n <- nchar(dates)
dates[n == 4] <- paste(dates[n == 4], "06-15", sep = "-")
dates[n == 7] <- paste(dates[n == 7], "15", sep = "-")

dates
#[1] "05/10/1983" "8/17/2014"  "1953-12-15" "1975-06-15"
#[5] "2001-06-17"

如您所见,结果与ifelse相同。

答案 1 :(得分:1)

以下是另一种方法 - 基于orders

library(lubridate)
dates <- c("05/10/1983","8/17/2014","1953-12","1975","2001-06-17")

parseDates <- function(x, orders = c('mdY', 'dmY', 'Ymd', 'Y', 'Ym')){
  fmts <- guess_formats(x, orders = orders)
  dte <- parse_date_time(x, orders = fmts[1], tz = 'UTC')
  if(!grepl('m', fmts[1]) ){
    dte <- dte + days(165)
    return(dte)
  }
  if(!grepl('d', fmts[1]) ){
    dte <- dte + days(14)
  }
  return(dte)
}

<强>输出

> parseDates(dates[4])
[1] "1975-06-15 UTC"
> parseDates(dates[3])
[1] "1953-12-15 UTC"

对于不同的日期格式,您只需更改orders参数,而其余参数使用lubridate完成。

希望这有用!