R で chron パッケージでの年の計算


はじめに

R で日付データの取り扱いを悩んでいたところ、chronというパッケージを見つけた。こちらの方がDate型やPOSIXct型より扱いが簡単そうなので、使ってみる。あるデータセットで扱うために、年/月/日付のデータから小数の年表示(例えば2021/3/1 -> 2021.164)と計算するような関数の作成を目指す。

※2021/03/03 計算間違いを修正した。

chronでの日付の扱い

以下、chron パッケージを用いた場合の年月日の扱いを書いていく。

> date_str <- "2021/03/01"
> dts <- dates(date_str, format = "y/m/d")
> dts
[1] 03/01/21
>
> #日付の足し算、引き算
> dts + 1
[1] 03/02/21
> dts - 1
[1] 02/28/21
>
> #日付の差分
> date_str2 <- "2021/03/15"
> dts2 <- dates(date_str2, format = "y/m/d")
> dts2 - dts
Time in days:
[1] 14

直感的に足し算、引き算が取り扱える。関数でうるう年の判定も可能

> #年を直接入力するとTRUE,FLASEが返ってくる。
> leap.year(2021)
[1] FALSE
> leap.year(2020)
[1] TRUE
>
> #日付をそのまま入れてもよい
> leap.year(dts)
[1] FALSE
> 

日付から年、月、日をそれぞれ独立に取り出したい時は、

> mdy <- month.day.year(dts)
> mdy$year
[1] 2021
> mdy$month
[1] 3
> mdy$day
[1] 1

とすると、個別に扱える。

小数年を計算する関数

chronを用いて小数年を計算する関数を作成した。

※日数を計算する所の修正を行った。

calc_year.R
library(chron)

calc_year <- function(date_str) {
  dts <- dates(date_str, format = "y/m/d")
  mdy <- month.day.year(dts)
  date_str0 <- paste(mdy$year-1, "/12/31", sep = "")
  dts0 <- dates(date_str0, format = "y/m/d")
  if (leap.year(dts)) {
    days <- 366
  } else {
    days <- 365
  }
  res <- mdy$year + (as.integer(dts - dts0))/days
  return(res)
}

実際に動かしてみると、

> source("calc_year.R")
> calc_year("2021/3/1")
[1] 2021.164

となり、計算ができていることが分かる。

おわりに

今回は年月日のみ扱ったが、chronでは時刻も扱えるようであるので、それについても記事にしていきたい。