我在使用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()它转换该值,它会抛出一个错误请求原点.
那么,有两个问题:这是否符合预期?如果是这样,是否有更合适的方式来转换日期,以便我实际上最终得到一个日期类型的对象?
谢谢
日期在内部表示为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请参阅此链接
这正如预期的那样。你用过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)