私はサツマイモ好きなので,コンビニのサツマイモ系スイーツは必ずチェックします.今日は大学のローソンで「さつまいもあんぱん コグマパン」という菓子パンが新発売されていたのでさっそく買って食べてみました.ということで,今回はRで時刻を日付に変えるときの注意です.
as.Date
を使うときはtz
を指定しろ
時刻データを扱うとき,私はas.POSIXct
を使います.例えば,
"2022/09/29 21:37:00"
という日付と時刻からなる文字列を,時刻データに変換するときは,
as.POSIXct("2022-09-29 21:37:00")
とします.Rの時刻データは,
"2022-09-29 21:37:00 JST"
のように表示されます."JST"の部分はタイムゾーンを表し,日本の時刻ということです.日本語環境だとデフォルトで"JST"になると思います.
このような時刻データから,日付だけを取り出したいとき,as.Date
を使います.例えば,
time <- as.POSIXct("2022-09-29 21:37:00") as.Date(time, tz="Japan")
とします.今回のポイントはas.Date
では,as.Date(... , tz="Japan")
のように必ずタイムゾーンを指定しろということです.
そのうち修正が入るかもしれませんが,as.POSIXct
は気を利かせてタイムゾーンを私が住んでいる日本にしてくれますが,as.Date
は,デフォルトでタイムゾーンがグリニッジ標準時 (Greenwich Mean Time: GMT)になります.日本とは9時間の時差があります (日本は西側の国より未来にいます).
つまり,as.Date(time)
として,タイムゾーンtz
の指定を省略すると,日本とは違う日付になることがあります.
日付がずれることの確認
結果はわかっていますが,as.Date
でタイムゾーンtz
の指定を省略すると,日付がずれることの確認です.以下のスクリプトを実行すると,
# 日時データを生成 date_time <- seq(as.POSIXct("2022-09-28 00:00:00"),as.POSIXct("2022-09-30 00:00:00"),"4 hours") date_time <- as.POSIXct(date_time,tz="GMT") # as.Dateを使って日付を抽出 date <- as.Date(date_time) # 曜日を抽出 weekday <- weekdays(date_time,abbreviate=TRUE) # as.Dateの挙動を確認 data.frame(date_time,weekday,as.Date=date,date=format(date_time,"%Y-%m-%d"))
以下のようになります.
date_time weekday as.Date date 1 2022-09-28 00:00:00 水 2022-09-27 2022-09-28 2 2022-09-28 04:00:00 水 2022-09-27 2022-09-28 3 2022-09-28 08:00:00 水 2022-09-27 2022-09-28 4 2022-09-28 12:00:00 水 2022-09-28 2022-09-28 5 2022-09-28 16:00:00 水 2022-09-28 2022-09-28 6 2022-09-28 20:00:00 水 2022-09-28 2022-09-28 7 2022-09-29 00:00:00 木 2022-09-28 2022-09-29 8 2022-09-29 04:00:00 木 2022-09-28 2022-09-29 9 2022-09-29 08:00:00 木 2022-09-28 2022-09-29 10 2022-09-29 12:00:00 木 2022-09-29 2022-09-29 11 2022-09-29 16:00:00 木 2022-09-29 2022-09-29 12 2022-09-29 20:00:00 木 2022-09-29 2022-09-29 13 2022-09-30 00:00:00 金 2022-09-29 2022-09-30
となります.上の出力の,as.Date
の列がas.Date
の結果です.date
の列が正しい日付なので,as.Date
の7から9行目と13行の結果は,日にちがずれてます.
まとめ
大規模な生体データを分析するときは,日付や時間を変数として使いこなすことが必要です.これから時々,時刻データを扱うテクニックを紹介していきます.