将Excel数字日期转换为R日期,但在某些行中只有给定的年份,例如“年”;2018年“;而不是",;43465“;

将Excel数字日期转换为R日期,但在某些行中只有给定的年份,例如“年”;2018年“;而不是",;43465“;,r,date,excel-dates,R,Date,Excel Dates,我读了一个Excel文件,其中一列包含日期。在某些行中没有完整的日期,但只给出了年份,例如2018年。 我在R中得到的是 > df$date [1] NA NA 43465 43465 43465 43465 2018 NA 43465 43465 43465 43465 我想将这些行转换为完整日期的日期格式,即在我的示例中,只有43465的行保持不变,其他行保持不变,即NA应保持NA和2018应保持2018 我知道我可以将Excel日期转换为如下as.Date(df

我读了一个Excel文件,其中一列包含日期。在某些行中没有完整的日期,但只给出了年份,例如2018年。 我在R中得到的是

> df$date
[1]    NA    NA 43465 43465 43465 43465  2018    NA 43465 43465 43465 43465
我想将这些行转换为完整日期的日期格式,即在我的示例中,只有
43465
的行保持不变,其他行保持不变,即
NA
应保持
NA
2018
应保持
2018

我知道我可以将Excel日期转换为如下
as.Date(df$Date,origin=“1899-12-30”)
,但以下两个想法给了我错误的输出

> as.Date(df$date, origin="1899-12-30")
[1] NA NA  "2018-12-31" "2018-12-31" "2018-12-31" "2018-12-31" "1905-07-10" NA "2018-12-31" "2018-12-31" "2018-12-31"
[12] "2018-12-31"
当然,
“1905-07-10”
不是我所期望的

> ifelse(df$date == 2018, 2018, as.Date(df$date, origin="1899-12-30"))
[1]    NA    NA 17896 17896 17896 17896  2018    NA 17896 17896 17896 17896

这里错误的输出是显而易见的。

一个向量不能有多个类。其中可以包含数字类或日期类。解决方法是使用最通用的字符类

x <- c(NA,NA,43465,43465,43465,43465,2018,NA,43465,43465, 43465, 43465)
ifelse(x == 2018, "2018", as.character(as.Date(x, origin="1899-12-30")))

# [1] NA  NA   "2018-12-31" "2018-12-31" "2018-12-31" "2018-12-31" "2018"      
# [8] NA   "2018-12-31" "2018-12-31" "2018-12-31" "2018-12-31"

基于@Ronak的答案,您可以使用正则表达式确定一个四位数字,然后用四个尾随零填充

x <- c(NA,NA,43465,43465,43465,43465,2018,NA,43465,43465, 43465, 43465)
ifelse(grepl('^\\d{4}$', x, perl = TRUE), 
   as.integer(paste0(x, '0000')), 
   as.integer(format(as.Date(x, origin='1899-12-30'), '%Y%m%d')))
[1]  NA       NA 20181231 20181231 20181231 20181231 20180000       NA 20181231 20181231 20181231 20181231

x谢谢,但不幸的是两者都不能解决我的问题,因为我确实需要数据框中的数据,并且我需要能够比较两个日期,也就是说,
2018-12-31>2017-12-31
应该返回
TRUE
,并且带有字符,这是不可能的。@user29184既然您无法将2018与任何日期进行比较,为什么要保留2018。您也可以将其设置为
NA
x <- c(NA,NA,43465,43465,43465,43465,2018,NA,43465,43465, 43465, 43465)
ifelse(grepl('^\\d{4}$', x, perl = TRUE), 
   as.integer(paste0(x, '0000')), 
   as.integer(format(as.Date(x, origin='1899-12-30'), '%Y%m%d')))
[1]  NA       NA 20181231 20181231 20181231 20181231 20180000       NA 20181231 20181231 20181231 20181231