【问题标题】:R find last weekday of monthR找到一个月的最后一个工作日
【发布时间】:2015-10-12 19:06:04
【问题描述】:

如何使用 R 找到该月的最后一个工作日(例如星期三)?在下面的代码中,我计算月、月中的某天、月中的周和工作日。 2014 年 1 月有 5 个星期三,但 2014 年 2 月只有 4 个星期三,所以我不能使用 max(week of the month) 作为过滤器。尽管我更喜欢使用基本的 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

【问题讨论】:

  • 目标是为每一天/每一行创建一个新列,给出该月的最后一个工作日?

标签: r date


【解决方案1】:

我想这就是你所追求的:

DF$last_weekday_o_month <- ave( 
  weekdays(DF$DATE), 
  months(DF$DATE), 
  FUN = function(x) tail(x[ !(x %in% c("Saturday","Sunday")) ], 1) 
)

查找最后一个工作日的特定日期......

DF$last_weekdaydate_o_month <- ave( 
  DF$DATE, 
  months(DF$DATE), 
  FUN = function(x) tail(x[ !(weekdays(x) %in% c("Saturday","Sunday")) ], 1) 
)

结果看起来像......

          DATE last_weekday_o_month last_weekdaydate_o_month
1   2014-01-01               Friday               2014-01-31
2   2014-01-02               Friday               2014-01-31
3   2014-01-03               Friday               2014-01-31
4   2014-01-04               Friday               2014-01-31
5   2014-01-05               Friday               2014-01-31
6   2014-01-06               Friday               2014-01-31
...
360 2014-12-26            Wednesday               2014-12-31
361 2014-12-27            Wednesday               2014-12-31
362 2014-12-28            Wednesday               2014-12-31
363 2014-12-29            Wednesday               2014-12-31
364 2014-12-30            Wednesday               2014-12-31
365 2014-12-31            Wednesday               2014-12-31

如果您先这样做,当然可以将last_weekday_o_month 计算为weekdays(last_weekdaydate_o_month)


正如@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

【讨论】:

  • 我正在尝试查找最后一个特定的工作日,例如该月的最后一个星期三。也许我可以修改你的代码说 FUN = function(x) tail(x[ ! (x %in% c("Monday", "Tuesday", "Thursday", "Friday", "Saturday", "Sunday") .
  • @user1491868 我已经更新了答案;是的,就是这样。
  • setDT(DF)[, last(DATE[!chron::is.weekend(DATE)]), by = month(DATE)] 可能有用
【解决方案2】:

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

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

【讨论】:

  • @Frank,啊,我刚刚加载了它,所以我以为我使用了它就添加了它。这里没有必要。
【解决方案3】:
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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-15
    • 2016-09-23
    • 1970-01-01
    • 2018-03-13
    • 2013-04-08
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多