2011-11-30 85 views
31

我用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" 

然后,我读了如何lubridate迎合现象,如间隔,持续时间和周期。所以,我知道一个月实际上是由(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' 

回答

70

是的,你找到了正确的把戏:从下个月第一天回来。

这里是作为一衬垫在基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其中(而被罚款封装)不需要用于这样的简单的任务。另外,它现有基函数的超载仍然让我觉得有些危险......

11

令人吃惊的是打字了一个问题的重点创作能量。我想我找出了答案。我不妨将它发布在这里,以便发现自己浪费时间的下一个可怜的灵魂。

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”指定。时区在需要时是救生员。其余时间他们是一个滋扰。

+4

使用'strftime(date)'来摆脱时区。所以'strftime('2010-10-31 UTC')'会给你'2010-10-31'。 – Ramnath

+0

你能接受你的答案以及下一个可怜的灵魂吗? –

+0

@SachaEpskamp:Stackoverflow将只允许我在两天后接受我的答案。我想这很聪明。可能有更优雅的另一个解决方法。 – Farrel