2017-08-25 67 views
-4

數據:臨近長週末和假日

我有日期在tibble載體。

# A tibble: 10 x 1 
     Date 
     <dttm> 
1 2017-04-04 
2 2017-04-05 
3 2017-04-07 
4 2017-04-10 
5 2017-04-11 
6 2017-04-12 
7 2017-04-13 
8 2017-04-14 
9 2017-04-17 
10 2017-04-18 

可重複使用:

structure(list(Date = structure(c(1491264000, 1491350400, 1491523200, 
1491782400, 1491868800, 1491955200, 1492041600, 1492128000, 1492387200, 
1492473600), class = c("POSIXct", "POSIXt"), tzone = "UTC")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L), .Names = "Date") 

需要

兩個特徵變量:

  • '接近到下個假期'
  • '背靠剛剛過去的假期'

目的是確定我的響應變量是否依賴於如果Date接近度假或長週末。舉例來說,如果04-11是一個假期,我會想:

  Date ProxNxtHol ProxPastHol 
     <dttm> 
1 2017-04-04 4   32 
2 2017-04-05 3   33 
3 2017-04-07 2   34 
4 2017-04-10 1   35 
5 2017-04-11 0   36 
6 2017-04-12 58   1 
7 2017-04-13 57   2 
8 2017-04-14 56   3 
9 2017-04-17 55   4 
10 2017-04-18 54   5 

雖然我可以手動定義所有的假期矢量自己並計算兩個日期之間的區別,這是麻煩,因爲過節而變化由全球定位。 (我有一個變量可以指示位置。)

是否有一個預定義的函數可以指示給定日期是否爲節假日或特定區域?

+1

請提供您想要創建接近變量的「日期向量」和假期。更好的是如果你提供所需的輸出。 – useR

+0

@useR完成。問題已更新。 – Rahul

+0

@ChiPak我看過'lubridate'。看起來不像它有我正在尋找的功能。 (請參閱更新的問題)。 – Rahul

回答

1

我已經想出了這個for循環,它可以計算出所需輸出中顯示的兩個接近度。請參閱下面的步驟。

轉換您的結構data frame及其所有元素Date

> qdates <- data.frame(qdates) 
> qdates$Date <- as.Date(qdates$Date) 
> qdates 

     Date 
1 2017-04-04 
2 2017-04-05 
3 2017-04-07 
4 2017-04-10 
5 2017-04-11 
6 2017-04-12 
7 2017-04-13 
8 2017-04-14 
9 2017-04-17 
10 2017-04-18 

使用library(timeDate)建立美國假期的data frame。您可以在此添加/修改您的日期,或使用其他可能包含聯邦假期的內置功能。

> library(timeDate) 
> hdates <- data.frame(Dates = c(USNewYearsDay(2017), USInaugurationDay(2017), USMLKingsBirthday(2017), 
           USLincolnsBirthday(2017), USWashingtonsBirthday(2017), USCPulaskisBirthday(2017), 
           USGoodFriday(2017), USMemorialDay(2017), USIndependenceDay(2017), USLaborDay(2017), 
           USColumbusDay(2017), USElectionDay(2017), USVeteransDay(2017), USThanksgivingDay(2017), 
           USChristmasDay(2017))) 

> colnames(hdates) <- "HolidayDate" 
> hdates$HolidayDate <- as.Date(hdates$HolidayDate) 
> hdates 

    HolidayDate 
1 2017-01-01 
2 2017-01-20 
3 2017-01-16 
4 2017-02-12 
5 2017-02-22 
6 2017-03-06 
7 2017-04-14 
8 2017-05-29 
9 2017-07-04 
10 2017-09-04 
11 2017-10-09 
12 2017-11-07 
13 2017-11-11 
14 2017-11-23 
15 2017-12-25 

for loop來計算日期差異並填充輸出。

for(i in 1:nrow(qdates)) { 
    minDate <- max(hdates[which(hdates$HolidayDate <= qdates$Date[i]),]) 
    maxDate <- min(hdates[which(hdates$HolidayDate >= qdates$Date[i]),]) 

    qdates$ProxPastHol[i] <- abs(difftime(minDate, qdates$Date[i], units = "days")) 
    qdates$ProxNxtHol[i] <- abs(difftime(maxDate, qdates$Date[i], units = "days")) 
} 

> qdates 

     Date ProxPastHol ProxNxtHol 
1 2017-04-04   29   10 
2 2017-04-05   30   9 
3 2017-04-07   32   7 
4 2017-04-10   35   4 
5 2017-04-11   36   3 
6 2017-04-12   37   2 
7 2017-04-13   38   1 
8 2017-04-14   0   0 
9 2017-04-17   3   42 
10 2017-04-18   4   41 

希望這有助於!

相關問題