簡體   English   中英

查找在R中的日期范圍內是否存在給定的季度

[英]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

我試圖創建一些列,以反映給定的季度和季度是否包含在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.

我嘗試了幾種不同的解決方案,但似乎都沒有用。 有什么想法嗎?

同樣使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM