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

drR*_*lay 6 r date-arithmetic

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

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

tmpDtm<-as.Date(as.character(tempDF$myDate), "%m/%d/%Y")
Run Code Online (Sandbox Code Playgroud)

这似乎给了我想要的东西,例如,如果我这样做到12/30/2014的起始值,我得到"2014-12-30"返回的值.但是,如果我使用了这个值typeof(),R告诉我它的数据类型是'double'.另外,如果我尝试将其绑定到其他值并使用c()或将其存储在数据框中,或者cbind()在数据框中,它最终存储为16434,这看起来像是日期的某种不同的内部存储值.我很确定这也是它的原因,因为如果我尝试再次使用as.Date()它转换该值,它会抛出一个错误请求原点.

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

谢谢

Ber*_*ard 8

日期在内部表示为double,如以下示例所示:

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

它仍然标记为类日期,如

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

因为它是双倍的,你可以用它做计算.但因为它是类Date,这些计算导致日期:

> 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"
Run Code Online (Sandbox Code Playgroud)

编辑我要求c()cbind(),因为它们可以用assciated一些奇怪的行为.请参阅以下示例,其中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"
Run Code Online (Sandbox Code Playgroud)

编辑2 - c()cbind强制对象为一种类型.第一个编辑显示强制的异常,但通常,向量必须是一个共享类型.cbind分享这种行为是因为它强制转换为矩阵,矩阵又强制转换为单一类型.

有关更多帮助typeof,class请参阅此链接


Dir*_*tel 5

这正如预期的那样。你用过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> 
Run Code Online (Sandbox Code Playgroud)

小广告:我随时都有一个新包,目前在 CRAN 接收,它处理这个问题,因为它将“任何”转换为 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> 
Run Code Online (Sandbox Code Playgroud)

  • 它现在在 CRAN 上:) (2认同)