将Excel数字日期转换为R日期,但在某些行中仅给出年份​​,例如“ 2018”而不是“ 43465”

时间:2019-11-06 08:47:14

标签: r date excel-dates

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

> df$date
[1]    NA    NA 43465 43465 43465 43465  2018    NA 43465 43465 43465 43465

我想将这些行转换为完整日期的日期格式,即在我的示例中,只有带有43465的行,而其他行保持原样,即NA应该保留{{1 }}和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"

这里的错误输出很明显。

2 个答案:

答案 0 :(得分:0)

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

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"

但是列表可以有多个类,因此如果可以将数据存储在列表中,我们可以使用lapply

lapply(x, function(y) 
     if (y == 2018 | is.na(y)) y else as.Date(y, origin="1899-12-30"))

答案 1 :(得分:0)

以@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

您将收到有关NA的一些警告消息,如果麻烦,您可以添加一个额外的ifelse来控制NA。在这里,我们使用逻辑grep测试来查看是否只有四个数字(一年),然后创建一个整数值。这样,您仍可以使用数学运算符,例如><==等,并保留所有信息。

您可以根据数据或用例在'0000'调用期间将paste0()更改为更合适的数字。