我在使用R中的as.Date函数时遇到了一些麻烦。我有一个日期向量,我正在从.csv文件中读取这些日期作为整数或字符的因素(取决于关于我如何阅读文件,但这似乎与问题没有任何关系),格式为%m/%d/%Y
。
我正在逐行浏览文件,取出日期字段并尝试将其转换为使用以下代码在其他地方使用:
tmpDtm<-as.Date(as.character(tempDF$myDate), "%m/%d/%Y")
这似乎给了我想要的东西,例如,如果我这样做到12/30/2014的起始值,我得到返回的值"2014-12-30"
。但是,如果我使用typeof()
检查此值,则R告诉我它的数据类型为“double”。此外,如果我尝试将其绑定到其他值并使用c()
或cbind()
将其存储在数据框中,则在数据框中,最终会将其存储为16434,这对我来说就像是一些一种日期的不同内部存储值。我很确定这也是它的原因,因为如果我尝试使用as.Date()
再次转换该值,则会引发错误请求原点。
所以,有两个问题:这是否符合预期?如果是这样,是否有更合适的方式来转换日期,以便我最终得到一个日期类型的对象?
谢谢
答案 0 :(得分:6)
日期在内部表示为double,如以下示例所示:
> typeof(as.Date("09/12/16", "%m/%d/%y"))
[1] "double"
它仍标记为类Date,如
> class(as.Date("09/12/16", "%m/%d/%y"))
[1] "Date"
因为它是双倍的,你可以用它做计算。但由于它属于Date类,因此这些计算会导致Dates:
> as.Date("09/12/16", "%m/%d/%y") + 1
[1] "2016-09-13"
> as.Date("09/12/16", "%m/%d/%y") + 31
[1] "2016-10-13"
EDIT
我曾要求c()
和cbind()
,因为他们可能会被某些奇怪的行为所引发。请参阅以下示例,其中在c
内切换顺序不是更改类型而是更改结果的类:
> c(as.Date("09/12/16", "%m/%d/%y"), 1)
[1] "2016-09-12" "1970-01-02"
> c(1, as.Date("09/12/16", "%m/%d/%y"))
[1] 1 17056
> class(c(as.Date("09/12/16", "%m/%d/%y"), 1))
[1] "Date"
> class(c(1, as.Date("09/12/16", "%m/%d/%y")))
[1] "numeric"
编辑2 - c()
和cbind
强制对象属于一种类型。第一个编辑显示强制的异常,但通常,向量必须是一个共享类型。 cbind
分享这种行为,因为它强制转换为矩阵,矩阵又强制转换为单一类型。
有关typeof
和class
的更多帮助,请参阅this link
答案 1 :(得分:3)
这是预期的。您使用了typeof()
;你可能应该使用class()
:
R> Sys.Date()
[1] "2016-09-12"
R> typeof(Sys.Date()) # this more or less gives you how it is stored
[1] "double"
R> class(Sys.Date()) # where as this gives you _behaviour_
[1] "Date"
R>
次要广告:我有一个新的包anytime,目前正在CRAN传入,处理此事件,因为它将“任何”转换为POSIXct(通过anytime()
)或日期(通过{{1 }}
E.g:
anydate()