187  数字を日付・時刻型へ(sld97)

library(tidyverse)
library(lubridate)
as_date(100)
[1] "1970-04-11"
as_datetime(100)
[1] "1970-01-01 00:01:40 UTC"

で、起点となる日付や時刻からに日数や秒数で時刻・日付を作成することはすでに解説しました。

ただ、例えば、

dat <- tibble(
  yr = 1901:1910,
  mn = 1:10,
  dy = 1:10,
  hr = 1:10,
  min = 1:10,
  sec = 1:10
)

dat
# A tibble: 10 × 6
      yr    mn    dy    hr   min   sec
   <int> <int> <int> <int> <int> <int>
 1  1901     1     1     1     1     1
 2  1902     2     2     2     2     2
 3  1903     3     3     3     3     3
 4  1904     4     4     4     4     4
 5  1905     5     5     5     5     5
 6  1906     6     6     6     6     6
 7  1907     7     7     7     7     7
 8  1908     8     8     8     8     8
 9  1909     9     9     9     9     9
10  1910    10    10    10    10    10

のように、数字で年月日 時間分秒が与えられた場合に、どのように時刻型や日付型に変換すればよいでしょうか?

文字列型に文字列をくっつけてやる方法はあります。

str_c(1900,"-",10,"-",11," ",12,":",15,":",20) %>% 
  as_datetime()
[1] "1900-10-11 12:15:20 UTC"

という方法ですが、これはなかなか煩雑です。

実は、

lubridate::make_date(year=1900,month=12,day=20)
[1] "1900-12-20"
lubridate::make_datetime(year=1900, month=11, day=20, hour=12, min=20,sec=30)
[1] "1900-11-20 12:20:30 UTC"

という感じで、make_ という関数を利用すれば数字で指定することができるので、

make_date(1900,12,10)
[1] "1900-12-10"
make_datetime(1900,12,10,23,12,45)
[1] "1900-12-10 23:12:45 UTC"

こんな感じで、数字の羅列で時刻・日付を作成することができます

ということで、

dat2 <- dat %>% 
  mutate(
    d = make_date(yr,mn,dy),
    t = make_datetime(yr,mn,dy,hr,min,sec)
  ) 

dat2$d
 [1] "1901-01-01" "1902-02-02" "1903-03-03" "1904-04-04" "1905-05-05"
 [6] "1906-06-06" "1907-07-07" "1908-08-08" "1909-09-09" "1910-10-10"
dat2$t
 [1] "1901-01-01 01:01:01 UTC" "1902-02-02 02:02:02 UTC"
 [3] "1903-03-03 03:03:03 UTC" "1904-04-04 04:04:04 UTC"
 [5] "1905-05-05 05:05:05 UTC" "1906-06-06 06:06:06 UTC"
 [7] "1907-07-07 07:07:07 UTC" "1908-08-08 08:08:08 UTC"
 [9] "1909-09-09 09:09:09 UTC" "1910-10-10 10:10:10 UTC"

こんな感じで数字から日付、時刻型を作成してとりだすことができます!

さて、ここまででだいぶ日付や時刻を作成することができるようになってきたと思います。次は、ここまであえて触れてこなかった

[10] “1910-10-10 10:10:10 UTC”

のUTCという部分について触れておきます。