使用as.Date获取前n个月

时间:2015-10-01 15:15:27

标签: r date

as.Date()有一个有用的功能,它可以提供最后n天,例如:

dt <- Sys.Date()-6
> dt
 [1] "2015-09-25"

有没有办法告诉它过去六个月而不是过去六天?

我需要比6*30更精确的东西,因为它应该是这个月的最后一天。

2 个答案:

答案 0 :(得分:3)

您不能仅使用Sys.Date来执行此操作,但有一些方法。以下内容将为您提供正确的月份,但不是正确的日期(即该月的最后一天):

#Sys.Date will return 2015-10-01 today
dates <- seq( Sys.Date() - months(6), Sys.Date(), '1 month')
dates
[1] "2015-04-01" "2015-05-01" "2015-06-01" "2015-07-01" "2015-08-01" "2015-09-01" "2015-10-01"

但是,我在R-bloggers上找到了this非常好的博客,它定义了这个功能(我稍微修改了它与Dates一起工作),它返回了当月的最后一天:

eom <- function(date) {
  # date character string containing POSIXct date
  date.lt <- as.POSIXlt(dates) # add a month, then subtract a day:
  mon <- date.lt$mon + 2 
  year <- date.lt$year
  year <- year + as.integer(mon==13) # if month was December add a year
  mon[mon==13] <- 1
  iso = ISOdate(1900+year, mon, 1, hour=0, tz='')
  result = as.POSIXct(iso) - 86400 # subtract one day
  result + (as.POSIXlt(iso)$isdst - as.POSIXlt(result)$isdst)*3600
}

现在正在运行:

> eom(dates)
[1] "2015-04-30 BST" "2015-05-31 BST" "2015-06-30 BST" "2015-07-31 BST" "2015-08-31 BST" "2015-09-30 BST" "2015-10-31 GMT"

返回正确的结果。

答案 1 :(得分:2)

这就是你要找的东西吗?

today = Sys.Date()
lastSixMonths = seq(today, length.out=6, by="-1 month")

print(lastSixMonths)
# [1] "2015-10-01" "2015-09-01" "2015-08-01" "2015-07-01" "2015-06-01"
# [6] "2015-05-01"