通常のデータクリーニングでの日付データ処理

文字データとして読み込んだ上で定型的なフォーマットならymd()とかymd_hms()とかでtz = "Asia/Tokyo"でほとんどどうにかなってしまう。

lubridate::ymd_hm("2015-11-09 14:35", tz = "Asia/Tokyo")
## [1] "2015-11-09 14:35:00 JST"
lubridate::ymd_hm("2015年11月9日 14時35分", tz = "Asia/Tokyo")
## [1] "2015-11-09 14:35:00 JST"

lubridate::parse_date_time(x, orders, tz = "Asia/Tokyo", locale = Sys.getlocale("LC_TIME"), ...)が便利そう。

年度計算

lubridate::quarter(x, with_year = TRUE, fiscal_start = 4)とかかと思いきやlubridate::quarter(lubridate::ymd("2019-03-02"), with_year = TRUE, fiscal_start = 4)2018.04になってほしいのに2019.04が返って来るので使えない。%m-%で月数を引き算してyear()で取り出すのが良さそう。

library(lubridate)
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date
ymd("2016-02-29") %m-% months(3) %>%
  year()
## [1] 2015

年齢計算

色々苦労する感じではあるが、lubridateパッケージを用いた以下の方法で問題なさそう(閏年とか月の日数違いとか)。一応誕生日の前日24時に年齢が増えるので、2/29生まれだと閏年以外では3/1に年齢が増えることになるがみなし的に2/28にしていることも多そう。道路交通法とかも2/28みなしでの運用。

birthday <- c("2016-02-03", "2016-02-03", "1900-01-01", "2016-02-29", "2016-02-29", "2016-02-29")
day_of_surgery <- c("2017-02-02", "2017-02-03", "1999-12-31", "2017-02-28", "2017-03-01", "2020-02-29")

lubridate::time_length(lubridate::interval(
  start = lubridate::ymd(birthday),
  end = lubridate::ymd(day_of_surgery)
  )
  , unit = "year") %>% 
  base::trunc()
## [1]  0  1 99  0  1  4