我的数据如下:
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
我正在尝试创建列,以反映给定的季度年份和季度是否包含在Open
和Close
之间的范围内。因此,在这种情况下有四分之三,最终数据看起来像:
# 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.
我尝试过几种不同的解决方案,但似乎没有一种解决方案。有什么想法吗?
答案 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))