2014-05-08 151 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