데이터 분석 중 필요해서 특정 연도의 휴일을 찾아주는 R function 을 작성해 보았습니다. 엔간한 기능은 검색하면 이미 구현된 코드나 패키지를 찾을 수 있는 게 보통이지만 이건 찾기 어렵더라구요. 비슷한 게 있나 싶으면 한국은 또 잘 안되고… 할 수 없이 삽질 끝에 만들어 봤습니다. 앞에 있는 패키지들 다 설치되어 있어야 하구요, https://www.timeanddate.com/holidays/ 라는 사이트에서 조회하는 걸로 했습니다. 이 사이트 문닫으면 다시 코딩해야 ^^;;;;
조회하면 뜨는 웹페이지에서 휴일이 나온 테이블 부분을 읽어와서 data.frame 으로 만든 후 tibble 로 변경해서 (다루기 쉽게 하려고…) 약간의 가공을 거쳐서 제시합니다. 웹페이지 상에서는 정말 쉬는 날 아닌 기념일 등도 조회되는 데 휴일만 걸러낸 결과입니다. 5월 1일 노동절 같은 경우에는 쉬는 곳도 있고 아닌 곳도 있을텐데 이 함수의 경우에는 빠지게 되어 있습니다. 결과 보시면 올해 5월 5일이 일요일에 걸려서 5월 6일이 대체 공휴일인 것까지 제대로 잘 조회됩니다. ^^
holidays <- function(country, yr) {
require(dplyr)
require(httr)
require(rvest)
require(stringr)
results <- NULL
url <- paste0("https://www.timeanddate.com/holidays/",
tolower(country), "/", yr)
pattern_md <- "(\\d+)월\\s(\\d+)일"
result <- url %>%
read_html() %>%
html_nodes(xpath = '//*[@id="holidays-table"]/tbody' ) %>%
html_table(header = FALSE) %>%
as.data.frame() %>%
as_tibble() %>%
filter(str_detect(X4, "((P|p)ublic|(N|n)ational)")) %>%
mutate(holiday_ymd =
as.Date(paste(yr, str_match(X1, pattern_md)[,2],
str_match(X1, pattern_md)[,3], sep ='-'))) %>%
select(holiday_ymd, X2, X3) %>%
rename("weekday" = "X2", "name_of_the_day" = "X3")
return(result)
}
> holidays("south-korea", 2024)
# A tibble: 18 × 3
holiday_ymd weekday name_of_the_day
<date> <chr> <chr>
1 2024-01-01 월요일 New Year's Day
2 2024-02-09 금요일 Seollal Holiday
3 2024-02-10 토요일 Seollal
4 2024-02-11 일요일 Seollal Holiday
5 2024-02-12 월요일 Seollal Holiday
6 2024-03-01 금요일 Independence Movement Day
7 2024-04-10 수요일 National Assembly Election Day
8 2024-05-05 일요일 Children's Day
9 2024-05-06 월요일 Day off for Children's Day
10 2024-05-15 수요일 Buddha’s Birthday
11 2024-06-06 목요일 Memorial Day
12 2024-08-15 목요일 Liberation Day
13 2024-09-16 월요일 Chuseok Holiday
14 2024-09-17 화요일 Chuseok
15 2024-09-18 수요일 Chuseok Holiday
16 2024-10-03 목요일 National Foundation Day
17 2024-10-09 수요일 Hangeul Proclamation Day
18 2024-12-25 수요일 Christmas Day