【发布时间】:2021-09-07 20:10:30
【问题描述】:
我正在尝试将字符串“2013-JAN-14”转换为日期,如下所示:
sdate1 <- "2013-JAN-14"
ddate1 <- as.Date(sdate1,format="%Y-%b-%d")
ddate1
但我明白了:
[1] NA
我做错了什么?我应该为此目的安装一个软件包吗(我尝试安装 chron)。
【问题讨论】:
我正在尝试将字符串“2013-JAN-14”转换为日期,如下所示:
sdate1 <- "2013-JAN-14"
ddate1 <- as.Date(sdate1,format="%Y-%b-%d")
ddate1
但我明白了:
[1] NA
我做错了什么?我应该为此目的安装一个软件包吗(我尝试安装 chron)。
【问题讨论】:
为我工作。它不适合您的原因可能与您的系统语言环境有关。
?as.Date 有话要说:
## This will give NA(s) in some locales; setting the C locale
## as in the commented lines will overcome this on most systems.
## lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- as.Date(x, "%d%b%Y")
## Sys.setlocale("LC_TIME", lct)
值得一试。
【讨论】:
as.Date 命令工作得很好。我知道您的问题已解决,但我只是想介绍此问题的另一种可能情况。
我下面的解决方案可能不适用于导致 as.Date() 返回 NA 的所有问题,但它确实适用于某些问题,即当以因子格式读取 Date 变量时。
只需使用 stringsAsFactors=FALSE 读取 .csv
data <- read.csv("data.csv", stringsAsFactors = FALSE)
data$date <- as.Date(data$date)
在尝试(但失败)使用我的系统语言环境解决 NA 问题后,此解决方案对我有用。
【讨论】:
如果您尝试将您的班级日期factor 转换为班级日期Date,也会发生这种情况。你需要先转换成POSIXt 否则as.Date 不知道你的字符串的哪一部分对应什么。
错误方式:直接从因子转换为日期:
a<-as.factor("24/06/2018")
b<-as.Date(a,format="%Y-%m-%d")
你会得到一个输出:
a
[1] 24/06/2018
Levels: 24/06/2018
class(a)
[1] "factor"
b
[1] NA
正确的方法,将因子转换为POSIXt,然后转换为日期
a<-as.factor("24/06/2018")
abis<-strptime(a,format="%d/%m/%Y") #defining what is the original format of your date
b<-as.Date(abis,format="%Y-%m-%d") #defining what is the desired format of your date
你会得到一个输出:
abis
[1] "2018-06-24 AEST"
class(abis)
[1] "POSIXlt" "POSIXt"
b
[1] "2018-06-24"
class(b)
[1] "Date"
【讨论】: