使用 as.date 和 if.else 无法从时间戳中提取日期

Fail to extract the date from the timestamp by using as.date and if.else

我已经在 mydata 中读取了一个 csv 文件,一个名为 inbound_date 的现有列,包含类似

的数据

NULL

2017-06-24 16:47:35

2017-06-24 16:47:35

我想创建一个新列来提取该列的日期。我试过下面的代码,但失败了,

mydata$inbound_day<-ifelse(is.null(mydata$inbound_date),"null",as.Date(mydata$inbound_date,format = "%Y-%m-%d"))

已添加新列 inbound_day,但它在所有行的列中显示为 NA。

能帮忙看看代码,哪里错了?谢谢!

你也必须指定时间。

x <- as.POSIXlt("2017-06-24 16:47:35", format = "%Y-%m-%d %H:%M:%S")

format(x, "%Y-%m-%d")
[1] "2017-06-24"

使用 lubridate 格式化而不是 as.date 然后提取日期

library(lubridate)
x <- ymd_hms("2017-06-24 16:47:35")
format(x, "%d")

这里有两件事在起作用。

  1. ifelse的行为。它将 return 与 条件的长度。如果条件returns只有一个值,ifelse return 也将是一个单一的值。

  2. is.null 的行为与 is.na 的行为不同。与 is.na 不同,is.null(mydata$inbound_date) 是检查整体 mydata$inbound_date1 作为单个对象,你得到 return 中只有一个值,即 False

这两件事的综合效果是您只得到第一个项目的 as.Date 值,而且它是一个 NA。更重要的是,这个 `NA 然后被回收以用 NA 填充整个列。

解决方案 -- 在您使用 is.null 的地方使用 is.na。它将 return 多个值并且事情将按预期工作。