为什么as.Date被返回为'double'类型?

时间:2016-09-12 20:41:20

标签: r date-arithmetic

我在使用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()再次转换该值,则会引发错误请求原点。

所以,有两个问题:这是否符合预期?如果是这样,是否有更合适的方式来转换日期,以便我最终得到一个日期类型的对象?

谢谢

2 个答案:

答案 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分享这种行为,因为它强制转换为矩阵,矩阵又强制转换为单一类型。

有关typeofclass的更多帮助,请参阅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()