R查找月的最后一个工作日

R查找月的最后一个工作日,r,date,R,Date,如何使用R查找一个月的最后一个工作日(如星期三)?在下面的代码中,我计算了月份、月份的哪一天、月份的哪一周和工作日。2014年1月有5个星期三,但2014年2月只有4个星期三,因此我不能使用max(每月的一周)作为过滤器。尽管我更喜欢使用基本的R函数,但我还是非常感谢您的帮助 DF <- data.frame(DATE = seq(as.Date("2014-01-01"), as.Date("2014-12-31"), "day")) DF$MONTH <- as

如何使用R查找一个月的最后一个工作日(如星期三)?在下面的代码中,我计算了月份、月份的哪一天、月份的哪一周和工作日。2014年1月有5个星期三,但2014年2月只有4个星期三,因此我不能使用max(每月的一周)作为过滤器。尽管我更喜欢使用基本的R函数,但我还是非常感谢您的帮助

DF <- data.frame(DATE = seq(as.Date("2014-01-01"), as.Date("2014-12-31"), "day"))

DF$MONTH         <- as.numeric(format(DF$DATE, "%m"))
DF$DAY_OF_MONTH  <- as.numeric(format(DF$DATE, "%d"))
DF$WEEK_OF_MONTH <- ceiling(as.numeric(format(DF$DATE, "%d")) / 7)
DF$WEEKDAY       <- format(DF$DATE, "%A")

DF

DF我想这就是你想要的:

DF$last_weekday_o_month <- ave( 
  weekdays(DF$DATE), 
  months(DF$DATE), 
  FUN = function(x) tail(x[ !(x %in% c("Saturday","Sunday")) ], 1) 
)
如果您先这样做,当然可以将
上个工作日(上个工作月)
计算为
工作日(上个工作日)


如@RichardScriven所建议的,通过几个软件包,可以更优雅/易懂地完成这项工作:

library(data.table)
setDT(DF)[, 
  last_weekdaydate_o_month := last(DATE[!chron::is.weekend(DATE)])
, by = month(DATE)]

           DATE last_weekdaydate_o_month
  1: 2014-01-01               2014-01-31
  2: 2014-01-02               2014-01-31
  3: 2014-01-03               2014-01-31
  4: 2014-01-04               2014-01-31
  5: 2014-01-05               2014-01-31
 ---                                    
361: 2014-12-27               2014-12-31
362: 2014-12-28               2014-12-31
363: 2014-12-29               2014-12-31
364: 2014-12-30               2014-12-31
365: 2014-12-31               2014-12-31

下面是一个使用
dplyr
的方法。基本上,您按月份分组,过滤掉“周末”天,并返回最后一天(即最大)的工作日

库(dplyr)
DF%
变异(月=月(日),工作日=工作日(日))%>%
分组单位(月)%>%
筛选器(!工作日%在%c中(“星期六”、“星期日”)%>%
总结(最后一个工作日=工作日(最长(日期)))
来源:本地数据帧[12 x 2]
上月上周日
4月1日星期三
8月2日星期五
12月3日星期三
2月4日星期五
1月5日星期五
7月6日星期四
6月7日星期一
3月8日星期一
5月9日星期五
11月10日星期五
10月11日星期五
9月12日星期二
库(lubridate)

x目标是为每一天/每一行创建一个新列,给出该月的最后一个工作日?我试图找到最后一个特定的工作日,例如,该月的最后一个星期三。也许我可以修改你的代码说FUN=function(x)tail(x[!(x%in%c(“周一”、“周二”、“周四”、“周五”、“周六”、“周日”)。@user1491868我已经更新了答案;是的,是这样的。
setDT(DF)[,last(DATE[!chron::is.weekend(DATE)],by=month(DATE)]
可能是useful@Frank,啊,我刚把它装上,所以我在想我用过的时候加上了它。这里没有必要。
library(data.table)
setDT(DF)[, 
  last_weekdaydate_o_month := last(DATE[!chron::is.weekend(DATE)])
, by = month(DATE)]
           DATE last_weekdaydate_o_month
  1: 2014-01-01               2014-01-31
  2: 2014-01-02               2014-01-31
  3: 2014-01-03               2014-01-31
  4: 2014-01-04               2014-01-31
  5: 2014-01-05               2014-01-31
 ---                                    
361: 2014-12-27               2014-12-31
362: 2014-12-28               2014-12-31
363: 2014-12-29               2014-12-31
364: 2014-12-30               2014-12-31
365: 2014-12-31               2014-12-31
library(dplyr)

DF <- data.frame(DATE = seq(as.Date("2014-01-01"), as.Date("2014-12-31"), "day"))

DF %>%
  mutate(month = months(DATE), weekday = weekdays(DATE)) %>%
  group_by(month) %>%
  filter(!weekday %in% c("Saturday", "Sunday")) %>%
  summarise(last_weekday = weekdays(max(DATE))) 

Source: local data frame [12 x 2]

       month        last_weekday
1      April           Wednesday
2     August              Friday
3   December           Wednesday
4   February              Friday
5    January              Friday
6       July            Thursday
7       June              Monday
8      March              Monday
9        May              Friday
10  November              Friday
11   October              Friday
12 September             Tuesday
library(lubridate)
x <- seq(as.Date("2007-12-31"), by="1 day", length.out=(Sys.Date() - as.Date("2007-12-31")))
library(plyr)
df <- data.frame(date=x, year=year(x), month=month(x))
df[,"weekday"] <- weekdays(df[,"date"])
df<- df[! df[,"weekday"] %in% c("Saturday", "Sunday"),]
df <- ddply(df, .(year, month), summarize, last=max(date))