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"