【问题标题】:R: Difference between two dates excluding weekends and given list of holidays specific to stateR:两个日期之间的差异,不包括周末和特定于州的假期列表
【发布时间】:2018-03-27 21:44:39
【问题描述】:

从这篇文章扩展这个问题

Difference between two dates excluding weekends and given list of holidays in R

如果我有特定于州的假期怎么办。我如何按州合并假期?

holiday <- data.frame(h = as.Date(c("2016/05/3", "2016/05/3"),'%Y/%m/%d'), 
                      s = c('state1','state2'),
                      stringsAsFactors=FALSE
                      )

d <- data.frame(d1 = as.Date(c('2016/05/2','2016/05/2'),'%Y/%m/%d'),
                d2= as.Date(c('2016/05/10','2016/05/10'),'%Y/%m/%d'),
                s = c('state1','state3'),
                stringsAsFactors=FALSE)

产生

> d
          d1         d2      s
1 2016-05-02 2016-05-10 state1
2 2016-05-02 2016-05-10 state3
> holiday
           h      s
1 2016-05-03 state1
2 2016-05-03 state2

链接中提供的解决方案是特定日期的假期,但不考虑各州。我怎样才能合并状态。

Desired state 是 d 中的一个额外列,用于计算不包括特定于州的周末和节假日的天数

【问题讨论】:

  • 请分享代码以创建您的数据,以及您想要的输出。如果您这样做,我们将更容易为您提供帮助。
  • 希望这些更改有所帮助。 tq

标签: r date datetime weekend


【解决方案1】:

这是我的问题的一个不雅的解决方案。希望你觉得这很有用。

library('dplyr')

holiday <- data.frame(h = as.Date(c("2016/05/3", "2016/05/3"),'%Y/%m/%d'), 
                      s = c('state1','state2'),
                      stringsAsFactors=FALSE
                      )

d <- data.frame(d1 = as.Date(c('2016/05/2','2016/05/2'),'%Y/%m/%d'),
                d2= as.Date(c('2016/05/10','2016/05/10'),'%Y/%m/%d'),
                s = c('state1','state3'),
                stringsAsFactors=FALSE)

state <- as.character(unique(d$s))

#function to exclude weekends and holidays
f <- function(a, b, h) { 
  d <- seq(a, b, 1)[-1]   
  sum(!format(d, "%u") %in% c("6", "7") & !d %in% h)
}
vf <- Vectorize(f, c("a", "b"))

#Function to calculate days excluding weekends and holidays by state
#state is done iteratively
datalist = list()
for (i in 1:length(state)) {
  # ... make some data

  #extract holidays by state as vectors
  holi <- holiday %>% 
    filter(s== state[i]) %>%
    select(h) %>%
    pull()

  #create new data by state
  dat <- d %>%
    filter(s == state[i])
  dat$diff <- with(dat,vf(d1, d2, holi))

  datalist[[i]] <- dat # add it to your list
  rm('dat')
}

new_df = dplyr::bind_rows(datalist)

按州区分节假日,不包括周末

          d1         d2      s diff
1 2016-05-02 2016-05-10 state1    5
2 2016-05-02 2016-05-10 state3    6

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 2019-12-10
    • 2015-04-25
    • 2019-12-03
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多