strptimeで%aとか%bを使うときにlocaleをチェックする
Rでdatetimeを扱うときにstrptimeでparseしますが、とあるデータを処理していた時に躓いたのでメモ。
08/Feb/2002:05:52:37 +0900,Hoge,Fuga
とか
21/Oct/2006:22:12:34 +0900,Hoge,Fuga
とか
Wed Sep 6 2006 11:34:00 +0900 (JST),Hoge,Fuga
と言ったログを
d = read.csv(filename)
で読み込んでから
> d$datetime = strptime(d$V1, "%b %a %d %Y %H:%M:%S %z (%Z)") # Wed Sep 6 2006 11:34:00 +0900 (JST)
として読み込むと失敗することがあって、こういうときはSys.getlocale()
でチェックする
> Sys.getlocale() [1] "ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8"
ja_JPとかなってる場合、%a
や%b
は「火曜日」「9月」になってしまっているからparseに失敗する。
なので、help(strptime)
の最後にもあるけれど、次のようにして、localeを直すとよい。
Sys.setlocale("LC_TIME", "C")
ただ、コレだと、元に戻せないので、
> lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C") [1] "C" > strptime("Wed Sep 2012 3 12:34:12", "%a %b %Y %d %H:%M:%S") [1] "2012-09-03 12:34:12" > Sys.setlocale("LC_TIME", lct) [1] "ja_JP.UTF-8"