2014-10-06 131 views
2

我想在月度級別上彙總我的日期。我想用一個月的最後一個星期六作爲那個月的日期。 我可以通過執行獲得週六的日期在一週: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

回答

5

1)動物園/切斷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,在拿到第一個月它的n再次使用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)動物園/ 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)動物園/ 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" 

這也向量化。

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"