2014-05-08 110 views
3

R中有做日曆算術的方法,例如:R中的日曆日期算術

> as.Date('2014-03-30') - months(1) 
[1] 2014-02-28 

除了在現實中沒有這樣的months功能。這可以用閏年和夏令時間在SQL和Java意識來完成,但我不能找到一個方法來做到這一點在R.我想我會弄巧和使用seq但沒有:

> seq(as.POSIXct('2014-03-30', tz='UTC'), by = '-1 months', length=2)[2] 
[1] "2014-03-02 UTC" 
+0

查看lubridate包 –

+0

@timriffe lubridate也不起作用。在我的例子中,你得到了「NA」。據說我可以使用'%m-%'但[這是壞](http://stackoverflow.com/q/14819362/712765)。 –

回答

4

下面是使用RcppBDT單程它包裝Boost Date_Time (部分),用於使用由R:

R> library(RcppBDT) 
R> dt <- new(bdtDt, 2014, 3, 30) 
R> dt 
[1] "2014-03-30" 
R> dt$addMonths(-1) 
R> dt 
[1] "2014-02-28" 
R> 
+0

應該'bdtDt'是'bdtDate'嗎?否則,我在這裏得到錯誤。其實我也沒有'addMonths',但我有'addDays'。 – thelatemail

+0

它是從我的R會話中複製並粘貼的。確保運行最近的0.2.3版本。 'demo/RcppBDTdd.R'中也有類似/相關的代碼。而只是爲了你,我只是在另一臺機器上重新運行它。 –

+0

我在浪費你的時間,它會教我不更新。 – thelatemail

-1

這是一個有組織的評論太長,但months的函數,並使用as.POSIXlt(如反對ct)ca n允許輕鬆提取日期屬性。

test <- as.POSIXlt('2014-03-30', tz='UTC') 
attributes(test)$names 
test$mon 
months(test) 

鑑於test$mon返回一個數值,它會很容易在幾個月執行算術。然而,從1月份減去1個月只會給你-1(1月是0),重新定義test$mon <- test$mon - 1似乎沒有多大幫助。

儘管如此,根據您的應用程序,上述信息可能仍然有用。

+0

這就是'seq'解決方案實際做到的。如果你做'xx <-as.POSIXlt('2014-03-30'); ××$週一<-xx $週一-1; XX;你會得到'「2014-03-02」'。它試圖去2月30日,它不會退出。因爲理論上這將是2月28日之後的兩天,它會在3月2日。 – MrFlick