初めに
lubridateパッケージを使っていると迷うことが多いので、調べたことをまとめている途中ですが、R言語 Advent Calendar 2023年(2nd)に空きが多いので投稿します。
まず初めにlubridateは遅いので(可読性は高いが)大規模データには使わない方がいいらしい。
https://qiita.com/okiyuki99/items/85ba75d232eb18717111
文字列から時刻型への変換
基本的にはあらゆる日付・時刻の文字列を変換する関数が用意されている。
変換したい文字列における年 (y), 月 (m), 日 (d), 時 (h), 分 (m) and 秒 (s) の要素の並び順を把握し、それに応じた関数を選ぶ。返り値の型別に整理する。
なお、以下の関数で変換するときにはタイムゾーンが
Datetime型
ymd_hms(), ymd_hm(), ymd_h().
日本人にとってオーソドックスなYYYYMMDD hh:mm:ss
の並び順で出てくるときに使う関数である。
下記のように日本語を含めた大体の表記はいけるが、元号は非対応である。
> ymd_hms("2023/01/20 12:34:56")
[1] "2023-01-20 12:34:56 UTC"
> ymd_hms("2023/01/20T12:34:56")
[1] "2023-01-20 12:34:56 UTC"
> ymd_hms("2023-01-20 123456")
[1] "2023-01-20 12:34:56 UTC"
> ymd_hms("20230120123456")
[1] "2023-01-20 12:34:56 UTC"
> ymd_hms("2023年01月20日12時34分56秒")
[1] "2023-01-20 12:34:56 UTC"
> ymd_hms("2023年1月20日12時34分56秒")
[1] "2023-01-20 12:34:56 UTC"
> ymd_hms("令和3年1月20日12時34分56秒")
[1] NA
ただし、この場合ではタイムゾーン付加されているが、(日本語の場合含めて)UTCになってしまっている。
タイムゾーンを以下の様に指定する必要がある。
> ymd_hms("2023/01/20T12:34:56",tz="Japan")
[1] "2023-01-20 12:34:56 JST"
> ymd_hms("2023/01/20T12:34:56+09:00")
[1] "2023-01-20 03:34:56 UTC"
Timezoneの変換
> lubridate::now()
[1] "2023-01-17 12:49:24 JST"
> hoge <- lubridate::now()
> hoge
[1] "2023-01-17 12:50:38 JST"
> lubridate::force_tz(hoge,tz="GMT")
[1] "2023-01-17 12:50:38 GMT"
> lubridate::with_tz(hoge,tz="GMT")
[1] "2023-01-17 03:50:38 GMT"
with_tzではタイムゾーンの変更のみ(表示される時刻は変わるが時刻は変わらない)が、
force_tzではタイムゾーンを強制的に変えるので時刻が変わる(表示される時刻は変わらない)。
OlsonNames()
を使えば、tzの指定に使えタイムゾーン一覧がでてくるが、"UTC"と"Japan"だけ覚えておけば日本人の使いたい業務の9割をカバーできるのではないかと思う。
(海外展開する予定ないのデータにtimezone付の時刻データで保存してわざわざUTCを付加するされていてはまってしまったせいでこの記事がかかれました。)