Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 接近长周末及;假期_R_Datetime - Fatal编程技术网

R 接近长周末及;假期

R 接近长周末及;假期,r,datetime,R,Datetime,数据: 我在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 需要: 两个特征变量: “临近下一个假日” “接近过去的假日”

数据:

我在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
需要

两个特征变量:

  • “临近下一个假日”
  • “接近过去的假日”
目的是确定我的响应变量是否取决于
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
Date ProxNxtHol ProxPastHol
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
虽然我可以自己手动定义一个向量中的所有假期,并计算两个日期之间的差异,但这很麻烦,因为全球各地的假期各不相同。(我有一个可以指示位置的变量。)


是否有一个预定义的函数可以指示指定区域的给定日期是否为假日?

我为循环提出了这个
,它可以计算两个接近度,如所需的输出所示。请参见下面的步骤

将结构转换为
数据框
,并将其所有元素转换为类
日期

> 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
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
for(i在1:nrow(qdates)){

minDate请提供您想要创建的邻近变量的“日期向量”和假日。更好的是,如果您提供所需的输出。@用户已完成。问题已更新。@ChiPak我已经查看了lubridate
。它似乎没有我要找的功能。(参考更新的问题)。请尝试使用
Holidays
package。它包含与交易假日的TimeWarp数据库交互的函数。例如,您可以执行类似
Holidays(2010:2017,allHolidays())
library(timeDate)
的操作,其中包含预定义函数
isHoliday()
用于确定日期是否为假日。例如:
timeDate::isHoliday(timeDate(“2017-12-31”),allHolidays())
> 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(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