我想在月度汇总我的日期.我想用某个月的最后一个星期六作为那个月的日期.我可以通过以下方式获得一周中星期六的日期:
as.Date(paste(6, week(mdy(mydate)), year(mdy(mydate)), sep="-"), "%u-%W-%Y")
Run Code Online (Sandbox Code Playgroud)
但是几个月有不同的天数,所以我不能这样做:
as.Date(paste(6, month(mdy(mydate)), year(mdy(mydate)), sep="-"), "%U-%m-%Y")
Run Code Online (Sandbox Code Playgroud)
即使我只是想获得一个月的第六天的日期,这甚至都不起作用.
我怎样才能得到一个月的最后一个星期六的日期?所以考虑一下09-15-2014我会得到的日期09-27-2014.
1)zoo/cut在动物园中快速参考小插图这个函数出现给定一个"Date"类变量,x如果没有,则返回相同的日期,如果不是:
library(zoo)
nextfri <- function(x) 7 * ceiling(as.numeric(x-5+4) / 7) + as.Date(5-4)
Run Code Online (Sandbox Code Playgroud)
将5替换为6将在下周六进行
nextsat <- function(x) 7 * ceiling(as.numeric(x-6+4) / 7) + as.Date(6-4)
Run Code Online (Sandbox Code Playgroud)
现在,如果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
Run Code Online (Sandbox Code Playgroud)
测试结果是:
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"
Run Code Online (Sandbox Code Playgroud)
这只使用矢量化函数,所以如果它x是一个日期向量,它仍然可以工作.
1a)zoo/as.yearmon.Date/as.Date.yearmon我们可以通过使用as.Date(as.yearmon(x), frac = 1)这个月的最后一天的日期来缩短这一点,其中as.yearmon.Date和as.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"
Run Code Online (Sandbox Code Playgroud)
这也是矢量化的.
2)zoo/lubridate上面没有使用lubridate但是我们可以返工(1)使用像这样的lubridate:
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"
Run Code Online (Sandbox Code Playgroud)
这也是矢量化的.