为什么 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
共享此行为,因为它强制转换为矩阵,而矩阵又转换为单一类型。
有关 typeof
和 class
的更多帮助,请参阅 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>
我在使用 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
共享此行为,因为它强制转换为矩阵,而矩阵又转换为单一类型。
有关 typeof
和 class
的更多帮助,请参阅 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>