ケィオスの時系列解析メモランダム

時系列解析,生体情報学,数学・物理などの解説です.

【Rで日付,時間を扱う】as.Dateを使うときはタイムゾーンを必ず指定しろ

私はサツマイモ好きなので,コンビニのサツマイモ系スイーツは必ずチェックします.今日は大学のローソンで「さつまいもあんぱん コグマパン」という菓子パンが新発売されていたのでさっそく買って食べてみました.ということで,今回は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行の結果は,日にちがずれてます.

まとめ

 大規模な生体データを分析するときは,日付や時間を変数として使いこなすことが必要です.これから時々,時刻データを扱うテクニックを紹介していきます.