[英]Finding if a given quarter was present in a date range in R
我有看起來像這樣的數據:
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.
我嘗試了幾種不同的解決方案,但似乎都沒有用。 有什么想法嗎?
同樣使用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
嘗試這個:
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')))
}
然后,您可以在兩個單獨的列上運行此函數,以指示開始日期位於哪個季度,結束日期位於哪個季度。
您可以使用lubridate軟件包,並將interval函數用作:
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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.