郵便番号データの操作と祝日判定の機能を追加したzipangu v0.2.0を公開
昨年バージョン0.1.0をリリースした、日本人が扱う住所や年号、漢数字のデータ操作を楽にするRパッケージ、{zipangu}に新しい機能を追加し、バージョン0.2.0としてCRANに登録しました。この記事では0.2.0で扱える新機能を紹介します。表題の通り、郵便番号データの操作と、祝日の判定機能がメインです。
https://cran.r-project.org/web/packages/zipangu/news/news.html
library(zipangu) library(dplyr, warn.conflicts = FALSE)
packageVersion("zipangu") ## [1] '0.2.0'
1. 郵便番号
日本郵便が住所別の郵便番号データを公開しています。このファイルをRに取り込む関数を用意しました。郵便番号ファイルは頻繁に更新されるため、ローカルでのパス指定だけでなくURLによるファイル読み込みも可能となっています。
公開されるファイルには、住所の表記に関していくつかの種類や事業所を含めたデータがありますが、こうしたバリエーションにも対応します。具体的には、type引数に対象ファイルを元に以下の値を与えます。
oogaki
: 読み仮名データの促音・拗音を小書きで表記しないものkogaki
: 読み仮名データの促音・拗音を小書きで表記するものroman
: 読み仮名データがローマ字jigyosyo
: 事業所の個別郵便番号
# パッケージに含まれるサンプルデータを読み込みます zipcode_file <- system.file("zipcode_dummy/13TOKYO_kogaki.CSV", package = "zipangu") df_oogaki <- zipangu::read_zipcode(path = zipcode_file, type = "oogaki")
glimpse(df_oogaki) ## Observations: 1 ## Variables: 15 ## $ jis_code <chr> "13101" ## $ old_zip_code <chr> "100" ## $ zip_code <chr> "1000001" ## $ prefecture_kana <chr> "トウキヨウト" ## $ city_kana <chr> "チヨダク" ## $ street_kana <chr> "チヨダ" ## $ prefecture <chr> "東京都" ## $ city <chr> "千代田区" ## $ street <chr> "千代田" ## $ is_street_duplicate <dbl> 0 ## $ is_banchi <dbl> 0 ## $ is_cyoumoku <dbl> 0 ## $ is_zipcode_duplicate <dbl> 0 ## $ status <dbl> 0 ## $ modify_type <dbl> 0
URLを直接指定する際は type の指定が不要です。
read_zipcode("https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip")
read_zipcode()
では圧縮ファイルをRに読み込みますが、dl_zipcode_file()
によりファイルをダウンロードしておくことも可能です。
dl_zipcode_file(path = "https://www.post.japanpost.jp/zipcode/dl/oogaki/zip/02aomori.zip")
このほか、is_zipcode()
と zipcode_spacer()
を用意しました。前者は入力が7桁の郵便番号かどうかをチェック、後者は郵便番号に使われるハイフンを追加・除去するちょっとした関数です。
is_zipcode(7000027) ## [1] TRUE
is_zipcode("700-0027") ## [1] TRUE
zipcode_spacer("3050053") ## [1] "305-0053"
# ハイフンを取り除く際は remove = TRUE を指定します zipcode_spacer("305-0053", remove = TRUE) ## [1] "3050053"
郵便番号データの公開は貴重ですが「KEN_ALL.csvの闇」と噂される記録のされ方で、実際に扱う場合は処理が面倒です。こうしたデータをtidyにする試みについては前回書いたとおりです。
この課題に関して、id:yutannihilation さんにも取り込んでいただきました。
機能要望として郵便番号の検索が提案されています。どういう形でデータを整形・表示すれば良いのかについて、議論の余地が残ると判断し、完成に至っていません。
2. 日本の祝日
祝日(国民の休日)判定のための関数を用意しました。これらは{zipangu}パッケージの開発のきっかけとなる{Nippon}で提供されていた機能でもあります。最初のリリースでは実装が追いついていませんでしたので、当初の目的を果たせました(拍手)。
入力に与えた日付が祝日かを返却する is_jholiday()
と その年の祝日を調べる jholiday()
があります。
Nippon::is.jholiday(as.Date("2019-12-23")) ## [1] TRUE is_jholiday(date = as.Date("2019-12-23")) ## [1] FALSE
# 今年の祝日を調べる jholiday(year = 2020, lang = "jp") ## $元日 ## [1] "2020-01-01" ## ## $成人の日 ## [1] "2020-01-13" ## ## $建国記念の日 ## [1] "2020-02-11" ## ## $天皇誕生日 ## [1] "2020-02-23" ## ## $春分の日 ## [1] "2020-03-20" ## ## $昭和の日 ## [1] "2020-04-29" ## ## $憲法記念日 ## [1] "2020-05-03" ## ## $みどりの日 ## [1] "2020-05-04" ## ## $こどもの日 ## [1] "2020-05-05" ## ## $海の日 ## [1] "2020-07-23" ## ## $スポーツの日 ## [1] "2020-07-24" ## ## $山の日 ## [1] "2020-08-10" ## ## $敬老の日 ## [1] "2020-09-21" ## ## $秋分の日 ## [1] "2020-09-22" ## ## $文化の日 ## [1] "2020-11-03" ## ## $勤労感謝の日 ## [1] "2020-11-23"
# 天皇誕生日は時代に合わせて変更されます jholiday_spec(year = 1988, name = "天皇誕生日", lang = "jp") ## [1] "1988-04-29"
jholiday_spec(2018, "天皇誕生日", lang = "jp") ## [1] "2018-12-23"
jholiday_spec(2020, "天皇誕生日", lang = "jp") ## [1] "2020-02-23"
大元の祝日の一覧は内閣府が配布するcsvファイルを参照しています。2020年1月現在に決まっているものなので、将来、祝日の変更があった際はデータを更新しなくてはいけなくなりますが、アーカイブされてしまった{Nippon}で用意されていた機能を復活させたこと、天皇の即位や東京オリンピック開催に関する2019、2020年の祝日の変更に対応できた点は良かったと思います。
また、ここでの作業の副産物として「ある月の第二月曜日」などを調べるための関数 find_date_by_wday()
ができました。年
(year
)、月 (month
)、曜日 (wday
… デフォルトでは日曜日が1)、週番号 (ordinal
)
を指定して実行します。
find_date_by_wday(year = 2020, month = 1, wday = 2, ordinal = 2) ## [1] "2020-01-13"
不具合や新機能の提案はGitHub issuesまたは Twitter @u_ribo までお願いします。