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