2011-11-30 45 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