在两年内生成一个月的最后一天的序列

我用lubridate,并认为这将是如此简单

ymd("2010-01-31")+months(0:23) 

但看看得到了什么。 这一切都搞砸了!

  [1] "2010-01-31 UTC" "2010-03-03 UTC" "2010-03-31 UTC" "2010-05-01 UTC" "2010-05-31 UTC" "2010-07-01 UTC" "2010-07-31 UTC" "2010-08-31 UTC" "2010-10-01 UTC" [10] "2010-10-31 UTC" "2010-12-01 UTC" "2010-12-31 UTC" "2011-01-31 UTC" "2011-03-03 UTC" "2011-03-31 UTC" "2011-05-01 UTC" "2011-05-31 UTC" "2011-07-01 UTC" [19] "2011-07-31 UTC" "2011-08-31 UTC" "2011-10-01 UTC" "2011-10-31 UTC" "2011-12-01 UTC" "2011-12-31 UTC" 

然后我读了如何应付间歇,持续时间和周期等现象。 所以,我知道一个月实际上是由(365 * 4 + 1)/ 48 = 30.438天定义的天数。 所以我试图变得聪明,重写为

 ymd("2010-01-31")+ as.period(months(0:23)) 

但是,这只是一个错误。

 Error in as.period.default(months(0:23)) : (list) object cannot be coerced to type 'double' 

是的,你find了正确的诀窍:从下个月的第一天开始回到原来的一天。

这里是作为基础R中的一行:

 R> seq(as.Date("2010-02-01"), length=24, by="1 month") - 1 [1] "2010-01-31" "2010-02-28" "2010-03-31" "2010-04-30" "2010-05-31" [6] "2010-06-30" "2010-07-31" "2010-08-31" "2010-09-30" "2010-10-31" [11] "2010-11-30" "2010-12-31" "2011-01-31" "2011-02-28" "2011-03-31" [16] "2011-04-30" "2011-05-31" "2011-06-30" "2011-07-31" "2011-08-31" [21] "2011-09-30" "2011-10-31" "2011-11-30" "2011-12-31" R> 

所以没有必要为这样简单的任务需要(这是一个很好的包) lubridate 。 另外,现有基础函数的重载仍然让我觉得有些危险。

如何input一个问题集中创造性的能量是惊人的。 我想我已经找出了答案。 我不妨把它发布在这里,为下一个发现自己浪费时间的可怜的灵魂。

 ymd("2010-02-01")+ months(0:23)-days(1) 

只需指定下个月的第一天,然后从中生成一个序列,但从中减去1天即可获得前一个月的最后一天。

 [1] "2010-01-31 UTC" "2010-02-28 UTC" "2010-03-31 UTC" "2010-04-30 UTC" "2010-05-31 UTC" "2010-06-30 UTC" "2010-07-31 UTC" "2010-08-31 UTC" "2010-09-30 UTC" [10] "2010-10-31 UTC" "2010-11-30 UTC" "2010-12-31 UTC" "2011-01-31 UTC" "2011-02-28 UTC" "2011-03-31 UTC" "2011-04-30 UTC" "2011-05-31 UTC" "2011-06-30 UTC" [19] "2011-07-31 UTC" "2011-08-31 UTC" "2011-09-30 UTC" "2011-10-31 UTC" "2011-11-30 UTC" "2011-12-31 UTC" 

顺便说一句,我如何摆脱烦人的“UTC”指定。 时区是需要的时候节省生命的。 其余的时间,他们是一个滋扰。