为什么 Date 作为类型 'double' 返回?

Why is Date is being returned as type 'double'?

我在使用 R 中的 as.Date 函数时遇到了一些问题。我有一个日期向量,我正在从 .csv 文件中读取这些日期作为整数因子或作为字符(取决于我在文件中的读取方式,但这似乎与问题无关),格式为 %m/%d/%Y.

我逐行浏览文件,提取日期字段并尝试使用以下代码将其转换为在其他地方使用:

tmpDtm <- as.Date(as.character(tempDF$myDate), "%m/%d/%Y")

这似乎给了我想要的东西,例如,如果我对 2014 年 12 月 30 日的起始值执行此操作,我将得到返回值 "2014-12-30"。然而,如果我使用 typeof() 检查这个值,R 告诉我它的数据类型是 'double'。此外,如果我尝试将其绑定到其他值并使用 c()cbind() 将其存储在数据框中,在数据框中,它最终被存储为 16434,在我看来这有点像日期的不同内部存储值。我很确定它也是如此,因为如果我尝试使用 as.Date() 再次转换该值,它会抛出一个错误,要求来源。

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

谢谢

日期在内部表示为双精度,如您在以下示例中所见:

> typeof(as.Date("09/12/16", "%m/%d/%y"))
[1] "double"

它仍然被标记为 class 日期,如

> class(as.Date("09/12/16", "%m/%d/%y"))
[1] "Date"

并且因为它是双精度数,所以您可以用它进行计算。但是因为它是 class 日期,这些计算导致日期:

> 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"

编辑 我要求 c()cbind(),因为它们可能与一些奇怪的行为有关。请参阅以下示例,其中在 c 内切换顺序不会更改类型,但会更改结果的 class:

> 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

这符合预期。您使用了 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 接收,它在将 "anything" 转换为 POSIXct(通过 anytime())或日期(通过 anydate().

例如:

R> anydate("12/30/2014")             # no format needed
[1] "2014-12-30"
R> anydate(as.factor("12/30/2014"))  # converts from factor too
[1] "2014-12-30"
R>