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

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

【Rでの時刻データの扱い】as.POSIXctを使うの卒業します

1時間ほど前に書いた記事では,Rで文字列を時刻データに変換するのに「私はas.POSIXctを使います」と言ってましたが,訂正します.

 私はas.POSIXctを2度と使いません

 今なら断言できます.Rでas.POSIXctを使ってる奴,素人です.

 as.POSIXctを使ってる人,人生を無駄にしています.

 as.POSIXctを使ってる勘違い野郎,さっきまでの私です.

 では,代わりに何を使うか.それが,fasttimeパッケージのfastPOSIXctです.さっき,偶然,インターネット検索で見つけましたが,このコマンドが私の人生を救ってくれると思います.それくらい,時系列解析,特に実世界データを分析する際には,時刻データの処理の高速化が重要です.なら,C言語使えよと言われるかもしれませんが,C言語で日付や時刻を扱うの面倒くさいです.10年前は,C言語とRの使用時間の比は9:1くらいでしたが,今は,1:99くらいです.

fasttimeパッケージのインストール

 一度もfasttimeパッケージを使ったことがない人は,

install.packages("fasttime")

を実行してパッケージをインストールしてください.

処理時間の比較

 fastPOSIXctのすごさを体感するために,数値実験をしてみます.

 使うのは以下のRスクリプトです.

# 日時の文字列データを生成 (テスト用に時刻データを文字列に変換)
time.chr <- as.character(seq(as.POSIXct("2022-09-20 00:00:00"),as.POSIXct("2022-09-30 00:00:00"),"1 sec"))
###############################################
# Rの関数as.POSIXctを使った場合
system.time(time <- as.POSIXct(time.chr))
###############################################
# "fasttime"パッケージのfastPOSIXctを使った場合
# パッケージインストール用
# install.packages("fasttime")
require(fasttime)
system.time(time <- fastPOSIXct(time.chr))

 
 このRスクリプトを実行すると,処理時間が表示されます.ここで使った,system.timeは処理時間を計算してくれるコマンドです.

 as.POSIXctを使って文字列を時刻データに変換すると,

> system.time(time <- as.POSIXct(time.chr))
   ユーザ   システム       経過  
     13.67       0.00      13.67 

という結果になりました.注目するのはユーザの部分の値で,処理時間が13.67秒かかったということです.

 次に,fastPOSIXctを使って文字列を時刻データに変換すると,

> system.time(time <- fastPOSIXct(time.chr))
   ユーザ   システム       経過  
      0.09       0.00       0.09 

という結果になりました.処理時間は,0.09秒でした.100m走のタイムが1/100になったくらいの衝撃です.

 fastPOSIXctを使って変換しても,結果はas.POSIXctと同じです.

【重要】日本時間での使い方

 fastPOSIXctを使うときの注意は,時刻のタイムスタンプが"GMT" (グリニッジ標準時)になってしまうことです.それと,常に1970-01-01 00:00:00が基準になり,as.POSIXctにあったoriginのオプションはありません.

 タイムスタンプが"GMT"というのは不便です.現状では,日本時間で時刻を扱うときは以下のようにする必要があります.

time <- fastPOSIXct(time, tz="Japan")-9*60*60

ここでは,タイムスタンプを"JST" (日本標準時)に指定して,"GMT"から"JST"の時差として勝手に補正される9時間の時差を差し引くことで,正しい日本時間にしています.

まとめ

 そのうち,as.POSIXctは改良されて速くなると思いますが,現状では,as.POSIXctなんて使ってられません.

 私は何ヶ月にもわたる長期計測データを分析することが多いので,fastPOSIXctはむちゃくちゃ助かります.今まで時刻の処理だけで10分くらいかかっていたものが,5秒以下で終わるって,感動です.