靠近长周末&假期

时间:2017-08-25 14:31:41

标签: r datetime

数据:

我有一个骰子的日期向量。

  # 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 个答案:

答案 0 :(得分: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美国假期。您可以在此处添加/修改日期,也可以使用其他可能包含联邦假期的内置功能。<​​/ p>

> 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循环计算日期差异,并填充输出。

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

希望这有帮助!!!