uribo / zipangu

Japanese utility functions and data
https://uribo.github.io/zipangu
Other
56 stars 7 forks source link

2021年8月9日がis_jholidayで休日として扱われない #31

Closed zettsu-t closed 3 years ago

zettsu-t commented 3 years ago

現象

2021年8月9日(月曜日)は、2021年8月8日の振替休日です。is_jholidayに対してFALSEを返します。以下のコードを実行すると再現します。

library(zipangu)
zipangu::is_jholiday("2021-08-09")
## [1] FALSE

2019年11月4日や2020年2月24日という振替休日に対して、 is_jholiday がTRUEを返すのであれば、2021年8月9日に対してもTRUEを返すのが一貫性のある動作と考えられます。

zipangu::is_jholiday("2019-11-04")
## [1] TRUE
zipangu::is_jholiday("2020-02-24")
## [1] TRUE

Issue [#14] に対して、私が zipangu::is_jholiday("2021-08-09") をテストしていれば分かったことでした。テストが足りず申し訳ありません。

再現環境

zipangu 0.2.2.9000 の、GitHubにおける最新版を、以下の通りインストールして実行しました。

library(devtools)
devtools::install_github("uribo/zipangu")

実行環境は、 Windows 10 + WSL Ubuntu 18.04 + R 3.6.3 および Windows 10 + R 3.6.3 です。

予想される原因

パッケージの内部データ zipangu:::jholiday_df は 内閣府が公開しているCSV に由来します。このデータが R/sysdata.rda に取り込まれていますが、2020年末までのデータなので、2021年以降の休日表が含まれていません。

local({
   load("R/sysdata.rda")
   ls()
   tail(jholiday_df$date)
})
## [1] "2020-07-24" "2020-08-10" "2020-09-21" "2020-09-22" "2020-11-03" "2020-11-23"

jholiday.R の実装によると、is_jholiday は振替休日に対してTRUEを返すことを jholiday 関数の結果ではなく、jholiday_df に基に判断しているようにみえます。よって R/sysdata.rda が更新されないと、2021年の振替休日を反映しないようです。

対策案

data-raw/japan-holiday.R を再実行して、 R/sysdata.rda を更新します。パッケージをビルドしたときに R/sysdata.rda が更新されませんでしたので、手動で更新する必要があるようです。japan-holiday.R と jpnprefs.R の反映という点からこの対策案が間違っているかもしれませんので、実際の対策はお任せします。

今日時点で、先ほどの内閣府が公開しているCSVファイルには、2022年末までの休祝日が載っています。2022年末までの祝日は 内閣府から公表 されています。先ほどと同じコードを再実行すると、 zipangu:::jholiday_df が2022年分まで更新されます。

source("data-raw/japan-holiday.R")
local({
   load("R/sysdata.rda")
   ls()
   tail(jholiday_df$date)
})
## [1] "2022-08-11" "2022-09-19" "2022-09-23" "2022-10-10" "2022-11-03" "2022-11-23"

動作確認

R/sysdata.rda を上記手順で更新後、パッケージをビルド、インストールして、以下を実行します。祝日に伴って設定される休日は、2021, 2022年については2021年8月9日だけが該当しますので、テストケースはこれだけです。

library(zipangu)
library(assertthat)
library(lubridate)
tail(zipangu:::jholiday_df)
assertthat::assert_that(lubridate::year(max(zipangu:::jholiday_df$date)) >= 2021)
assertthat::assert_that(zipangu::is_jholiday("2021-08-09"))
uribo commented 3 years ago

詳細にお伝えくださり、ありがとうございます。 ご指摘いただいた通り、rawデータの更新が不足しておりました。

2b85b4a08247f5f7b3f090428735a26dc9cd5282 にて修正いたしました。

pkgload::load_all()
is_jholiday("2021-08-9")
#> [1] TRUE

この問題を解決したバージョンを再度CRANに登録させていただきます。

zettsu-t commented 3 years ago

こちらこそ #14 で必要な変更が不足しており、お手数をお掛けしました。対応ありがとうございます。