找出R中日期范围内是否存在给定的四分之一

时间:2018-04-18 13:45:50

标签: r date

我的数据如下:

library(dplyr)
a<-data_frame(open=as.Date(c("12-31-2016","10-28-2016","08-01-2016"),format=c("%m-%d-%Y")),close=as.Date(c("01-04-2017","01-05-2017","01-01-2017"),format=c("%m-%d-%Y")))
# A tibble: 3 x 2
open       close     
<date>     <date>    
2016-12-31 2017-01-04
2016-10-28 2017-01-05
2016-08-01 2017-01-01

我正在尝试创建列,以反映给定的季度年份和季度是否包含在OpenClose之间的范围内。因此,在这种情况下有四分之三,最终数据看起来像:

# A tibble: 3 x 5
 open       close      Q3_2016 Q4_2016 Q1_2017
<date>     <date>       <dbl>   <dbl>   <dbl>
2016-12-31 2017-01-04      0.      1.      1.
2016-10-28 2017-01-05      0.      1.      1.
2016-08-01 2017-01-01      1.      1.      1.

我尝试过几种不同的解决方案,但似乎没有一种解决方案。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

同样使用lubridate包,您可以使用int_overlaps功能:

library(lubridate)
a %>%
  mutate(Q3_2016=int_overlaps(interval(ymd(open),ymd(close)),interval(ymd("2016-07-01"),ymd("2016-09-30")))*1,
         Q4_2016=int_overlaps(interval(ymd(open),ymd(close)),interval(ymd("2016-10-01"),ymd("2016-12-31")))*1,
         Q1_2017=int_overlaps(interval(ymd(open),ymd(close)),interval(ymd("2017-01-01"),ymd("2017-03-31")))*1)

  open       close      Q3_2016 Q4_2016 Q1_2017
  <date>     <date>       <dbl>   <dbl>   <dbl>
1 2016-12-31 2017-01-04    0       1.00    1.00
2 2016-10-28 2017-01-05    0       1.00    1.00
3 2016-08-01 2017-01-01    1.00    1.00    1.00

答案 1 :(得分:0)

试试这个:

DateToQuartersGen <- function(DATES){
        q1 <- as.Date("2012-10-01",  format = "%Y-%m-%d") # start of first quarter
        q2 <- as.Date("2012-01-01",  format = "%Y-%m-%d") # start of second quarter
        q3 <- as.Date("2012-04-01",  format = "%Y-%m-%d") # start of third quarter
        q4 <- as.Date("2012-07-01",  format = "%Y-%m-%d") # start of forth quarter

        # Convert dates from any year to 2012 dates
        d <- as.Date(strftime(DATES, format="2012-%m-%d"))

        ifelse(d >= q1 | d < q2, '1st Quarter',
               ifelse(d >= q2 & d < q3, '2nd Quarter',
                      ifelse(d >= q3 & d < q4, '3rd Quarter', '4th Quarter')))
}

然后,您可以在两个单独的列上运行此功能,这些列将指示开始日期的四分之一以及结束日期的四分之一。

答案 2 :(得分:0)

您可以使用lubridate包和间隔函数:

Q3_2016 <- interval(ymd("2016-07-01"),ymd("2016-09-30"))
Q4_2016 <- interval(ymd("2016-10-01"),ymd("2016-12-31"))
Q1_2017 <- interval(ymd("2017-01-01"),ymd("2016-03-31"))

a %>% 
mutate(Q3_2016=ifelse(interval(ymd(open),ymd(close)) %within% Q3_2016,TRUE,FALSE)) %>%
mutate(Q4_2016=ifelse(interval(ymd(open),ymd(close)) %within% Q4_2016,TRUE,FALSE)) %>%
mutate(Q1_2017=ifelse(interval(ymd(open),ymd(close)) %within% Q1_2017,TRUE,FALSE))