Lubridate在一个月内获得某一天的日期

时间:2014-10-06 23:35:22

标签: r lubridate

我想在月度汇总我的日期。我想用某个月的最后一个星期六作为那个月的日期。 我可以通过以下方式获得一周中星期六的日期:

as.Date(paste(6, week(mdy(mydate)), year(mdy(mydate)), sep="-"), "%u-%W-%Y")

但是几个月有不同的天数,所以我不能这样做:

as.Date(paste(6, month(mdy(mydate)), year(mdy(mydate)), sep="-"), "%U-%m-%Y")

即使我只是想获得一个月的第六天的日期,这甚至都不起作用。

如何获取一个月的最后一个星期六的日期?所以给定日期09-15-2014我会得到09-27-2014

2 个答案:

答案 0 :(得分:5)

1)zoo / cut zoo Quick Reference vignette中出现了这个给定"Date"类变量x的函数,如果是星期五或者它返回相同的日期或如果没有下周五:

library(zoo)
nextfri <- function(x) 7 * ceiling(as.numeric(x-5+4) / 7) + as.Date(5-4)

将5替换为6会给下一个星期六

nextsat <- function(x) 7 * ceiling(as.numeric(x-6+4) / 7) + as.Date(6-4)

现在,如果x是输入并且属于Date类,请使用cut获取当月的第一个,然后再次使用cut获取下个月的第一个,找到下周六使用nextsat,然后减去7以获得输入日期月份的最后一个星期六。

the.first <- as.Date(cut(x, "month"))
next.month <- as.Date(cut(the.first + 32, "month")
nextsat(next.month) - 7

测试结束:

library(zoo)
x <- as.Date("2014-09-15")
nextsat <- function(x) 7 * ceiling(as.numeric(x-6+4) / 7) + as.Date(6-4)
the.first <- as.Date(cut(x, "month"))
next.month <- as.Date(cut(the.first + 32, "month"))
nextsat(next.month) - 7
## [1] "2014-09-27"

这仅使用矢量化函数,因此如果x是日期的向量,它仍然可以工作。

1a)zoo / as.yearmon.Date / as.Date.yearmon 我们可以通过使用as.Date(as.yearmon(x), frac = 1)是月份最后一天的日期来缩短这一点动物园方法是as.yearmon.Dateas.Date.yearmon

library(zoo)
x <- as.Date("2014-09-15")
nextsat <- function(x) 7 * ceiling(as.numeric(x-6+4) / 7) + as.Date(6-4)
nextsat(as.Date(as.yearmon(x), frac = 1) + 1) - 7
## [1] "2014-09-27"

这也是矢量化的。

2)zoo / lubridate 上面没有使用lubridate但我们可以返工(1)使用像这样的润滑剂:

library(zoo)
library(lubridate)
nextsat <- function(x) 7 * ceiling(as.numeric(x-6+4) / 7) + as.Date(6-4)
x <- as.Date("2014-09-15")
xx <- x
day(xx) <- 1
month(xx) <- month(xx) + 1
nextsat(xx) - 7
## [1] "2014-09-27"

这也是矢量化的。

答案 1 :(得分:4)

使用标准R日期函数:

x <- as.Date(c("09-15-2014","09-15-2014"),format="%m-%d-%Y")

lastsat <- function(x,day) {
 bits <- sapply(x, function(i) {
  res <- seq.Date(as.Date(format(i,"%Y-%m-01")),length=2,by="1 month")[2] - (1:7)
  res[format(res, "%u") == as.character(day)]
 })
 as.Date(bits, origin="1970-01-01")
}

lastsat(x,6)
#[1] "2014-09-27" "2014-09-27"