在date时间对象上循环会产生一个数字迭代器

为什么遍历DatePOSIXct对象会导致numeric ? 例如:

 test = as.Date("2009-01-01") print( class( test ) ) # [1] "Date" for ( day in test ) { print( class( day ) ) } # [1] "numeric" 

POSIXct发生同样的情况:

 test = as.POSIXct("2009-01-01") print( class( test ) ) # [1] "POSIXct" "POSIXt" for ( day in test ) { print( class( day ) ) } # [1] "numeric" 

?"for"表示seq (后面的部分)是“对一个向量(包括一个列表和一个expression式)或一个pairlist或'NULL'进行评估的expression式。

所以你的Date向量被强制为numeric因为Date对象不是严格的向量:

 is.vector(Sys.Date()) # [1] FALSE is.vector(as.numeric(Sys.Date())) # [1] TRUE 

POSIXctvector也是如此:

 is.vector(Sys.time()) # [1] FALSE is.vector(as.numeric(Sys.time())) # [1] TRUE 

循环通过天(string):

  days <- seq(from=as.Date('2011-02-01'), to=as.Date("2011-03-02"),by='days' ) for ( i in seq_along(days) ) { print(i) print(days[i]) } 

在使用for循环时,您没有select适用于Date向量的正确函数。 更好的做法是包装seq_along几乎每一个date或因素是循环。 然后你会做两件事情:a)设置它,所以你期望一个从1开始的索引,和b)防止零长度向量发生的奇怪事情。 我也认为使用它的因素会更好,for循环会变成字符向量。

关于约书亚的答案(这当然是正确的和有帮助的),我认为is.vector函数有点错误标记,或者只是误解了。 可以更准确地将其称为hasNoAttributesOtherThanName 。 大多数人认为“vector”的属性用is.atomic进行testing, DatePOSIXct对象将从该testing返回TRUE

看来,实现for循环的C函数不会复制vector的任何属性。 这还包括class属性,这应该使i看起来是一个Date对象。

您可以在这里学习do_for(SEXP, SEXP, SEXP, SEXP)函数(R所调用的函数do_for(SEXP, SEXP, SEXP, SEXP)的源代码。

这是个老问题,但我是R的新手,面临同样的问题。 由于我的问题将被并行处理,我用foreach ,看到行为是不同于正常for

 library(foreach) start_date = as.Date("2013-08-1") end_date = as.Date("2013-08-13") days = seq(start_date, end_date, by = "day") foreach(day = days, .combine='rbind') %dopar% { print(class(day)) } [1] "Date" [1] "Date" [1] "Date" [1] "Date" ... 

由于我没有经历大多数R的内在事情,所以我不知道为什么foreach最终有不同的行为,但是为我的目的工作,并希望可能对别人有用。

date对象的任何数字操作通常会返回天数。 在这里,你要求它提供从这个时代开始的天数。 14245这是1970-01-01 – 2009-01-01之间的天数

从?date:

date表示为自1970-01-01以来的天数,较早的date为负值。 它们总是按照公历日历的规则打印,即使那个日历早已不被使用(它在1752年被英国及其殖民地采用)。

date应该是一个整数,但这不是在内部表示中强制执行的。 打印时,分数天将被忽略。 可以通过平均方法或者通过加或减(见Ops.Date)来产生分数天。

尝试添加print(day) ,看看我的意思。

 test = as.Date("2009-01-01") print( class( test ) ) for ( day in test ) { print(day) print( class( day ) ) }