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秒以下で終わるって,感動です.