将因子转换为不带 NA 的日期对象 R
Convert factor to date object R without NA
问题: 如何在不获取 NA
值的情况下将 factor
转换为 date
对象。
这是一个类似的 post:Convert Factor to Date/Time in R
在 post 中,用户在 date
之前转换为 character
对象。在 as.Date
函数中使用 as.character
转换为 character
对象时,我得到 NA
值。
我在数据框中有一列日期以因子格式显示,出现次数不同。这是 data.frame 中包含的信息。
> head(fraud, 5)
TRANSACTION.DATE TRANSACTION.AMOUNT AIR.TRAVEL.DATE POSTING.DATE
1 2/27/14 25.00 <NA> 2/28/14
2 2/28/14 25.00 <NA> 2/28/14
3 2/27/14 25.00 <NA> 2/28/14
4 2/27/14 20.00 2/27/14 2/28/14
5 2/27/14 12.13 <NA> 2/28/14
> str(fraud$TRANSACTION.DATE)
Factor w/ 519 levels "1/1/14","1/1/15",..: 228 230 228 228 228 230 226 228 230 228 ...
> summary(fraud$TRANSACTION.DATE, 5)
9/30/14 9/17/14 11/4/14 9/23/14 (Other)
197 187 171 160 19221
将因子转换为 date
对象导致 NA
值。
> fraud$TRANSACTION.DATE <- as.Date(as.character(fraud$TRANSACTION.DATE),
+ format = "%m/%d/%Y")
> head(fraud$TRANSACTION.DATE, 5)
[1] NA NA NA NA NA
正在检查 as.character
功能是否有效。
> fraud$TRANSACTION.DATE <- as.character(fraud$TRANSACTION.DATE)
> head(fraud$TRANSACTION.DATE)
[1] NA NA NA NA NA NA
编辑:我使用了 as.Date 函数,但格式错误
> fraud$TRANSACTION.DATE <- as.Date(fraud$TRANSACTION.DATE, format = "%m/%d/%Y")
> str(fraud$TRANSACTION.DATE)
Date[1:19936], format: "0014-02-27" "0014-02-28" "0014-02-27" "0014-02-27" "0014-02-27" ...
> head(fraud$TRANSACTION.DATE, 5)
[1] "0014-02-27" "0014-02-28" "0014-02-27" "0014-02-27" "0014-02-27"
编辑 2:这是输出值
> dput(droplevels(head(fraud$TRANSACTION.DATE)))
structure(c(1L, 2L, 1L, 1L, 1L, 2L), .Label = c("2/27/14", "2/28/14"
), class = "factor")
解决方法:用%y代替%Y
> fraud$TRANSACTION.DATE <- as.Date(fraud$TRANSACTION.DATE, "%m/%d/%y")
> head(fraud$TRANSACTION.DATE, 5)
[1] "2014-02-27" "2014-02-28" "2014-02-27" "2014-02-27" "2014-02-27"
现在的问题是您的格式字符串声明日期包括年份 和世纪 而您的日期仅包含年份 没有世纪 .您需要使用 %y
占位符,而不是 %Y
占位符。
dates <- factor(c("2/27/14","2/28/14","2/27/14","2/27/14","2/27/14"))
as.Date(dates, format = "%m/%d/%y") # correct lowercase y
as.Date(dates, format = "%m/%d/%Y") # incorrect uppercase y
> as.Date(dates, format = "%m/%d/%y")
[1] "2014-02-27" "2014-02-28" "2014-02-27" "2014-02-27" "2014-02-27"
> as.Date(dates, format = "%m/%d/%Y")
[1] "14-02-27" "14-02-28" "14-02-27" "14-02-27" "14-02-27"
请注意,当您使用正确的占位符时,R 是正确的;小写 y.
当你没有世纪的年份时 %Y
会发生什么似乎 OS 依赖。正如您在 Linux (Fedora 22) 上看到的那样,我没有得到年份部分的填充,而您看到的是零填充。
问题: 如何在不获取 NA
值的情况下将 factor
转换为 date
对象。
这是一个类似的 post:Convert Factor to Date/Time in R
在 post 中,用户在 date
之前转换为 character
对象。在 as.Date
函数中使用 as.character
转换为 character
对象时,我得到 NA
值。
我在数据框中有一列日期以因子格式显示,出现次数不同。这是 data.frame 中包含的信息。
> head(fraud, 5)
TRANSACTION.DATE TRANSACTION.AMOUNT AIR.TRAVEL.DATE POSTING.DATE
1 2/27/14 25.00 <NA> 2/28/14
2 2/28/14 25.00 <NA> 2/28/14
3 2/27/14 25.00 <NA> 2/28/14
4 2/27/14 20.00 2/27/14 2/28/14
5 2/27/14 12.13 <NA> 2/28/14
> str(fraud$TRANSACTION.DATE)
Factor w/ 519 levels "1/1/14","1/1/15",..: 228 230 228 228 228 230 226 228 230 228 ...
> summary(fraud$TRANSACTION.DATE, 5)
9/30/14 9/17/14 11/4/14 9/23/14 (Other)
197 187 171 160 19221
将因子转换为 date
对象导致 NA
值。
> fraud$TRANSACTION.DATE <- as.Date(as.character(fraud$TRANSACTION.DATE),
+ format = "%m/%d/%Y")
> head(fraud$TRANSACTION.DATE, 5)
[1] NA NA NA NA NA
正在检查 as.character
功能是否有效。
> fraud$TRANSACTION.DATE <- as.character(fraud$TRANSACTION.DATE)
> head(fraud$TRANSACTION.DATE)
[1] NA NA NA NA NA NA
编辑:我使用了 as.Date 函数,但格式错误
> fraud$TRANSACTION.DATE <- as.Date(fraud$TRANSACTION.DATE, format = "%m/%d/%Y")
> str(fraud$TRANSACTION.DATE)
Date[1:19936], format: "0014-02-27" "0014-02-28" "0014-02-27" "0014-02-27" "0014-02-27" ...
> head(fraud$TRANSACTION.DATE, 5)
[1] "0014-02-27" "0014-02-28" "0014-02-27" "0014-02-27" "0014-02-27"
编辑 2:这是输出值
> dput(droplevels(head(fraud$TRANSACTION.DATE)))
structure(c(1L, 2L, 1L, 1L, 1L, 2L), .Label = c("2/27/14", "2/28/14"
), class = "factor")
解决方法:用%y代替%Y
> fraud$TRANSACTION.DATE <- as.Date(fraud$TRANSACTION.DATE, "%m/%d/%y")
> head(fraud$TRANSACTION.DATE, 5)
[1] "2014-02-27" "2014-02-28" "2014-02-27" "2014-02-27" "2014-02-27"
现在的问题是您的格式字符串声明日期包括年份 和世纪 而您的日期仅包含年份 没有世纪 .您需要使用 %y
占位符,而不是 %Y
占位符。
dates <- factor(c("2/27/14","2/28/14","2/27/14","2/27/14","2/27/14"))
as.Date(dates, format = "%m/%d/%y") # correct lowercase y
as.Date(dates, format = "%m/%d/%Y") # incorrect uppercase y
> as.Date(dates, format = "%m/%d/%y")
[1] "2014-02-27" "2014-02-28" "2014-02-27" "2014-02-27" "2014-02-27"
> as.Date(dates, format = "%m/%d/%Y")
[1] "14-02-27" "14-02-28" "14-02-27" "14-02-27" "14-02-27"
请注意,当您使用正确的占位符时,R 是正确的;小写 y.
当你没有世纪的年份时 %Y
会发生什么似乎 OS 依赖。正如您在 Linux (Fedora 22) 上看到的那样,我没有得到年份部分的填充,而您看到的是零填充。