我有一个超过10万行的大日期框架。日期列包含多种格式的日期,例如"%m/%d/%Y"
,"%Y-%m"
,"%Y"
和"%Y-%m-%d"
。我可以将这些全部转换为parse_date_time()
的{{1}}日期。
lubridate
但正如您所看到的,这会将缺少日期的日期设置为当月的第一天,并将缺少月份和日期的日期设置为一年中的第一天。我怎样才能将它们分别设置为15日和6月15日?
答案 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
完成。
希望这有用!