2011-03-17 122 views
7

我在使用我的軟件包的函數中使用了strptime(...)。我需要使用特定的本地設置解析字符串,並使用Sys.setlocale作爲解決方法來獲取英文本地化設置。爲了減少副作用,以前的本地設置會在之後恢復。 函數的基本代碼片段如下所示:Sys.setlocale:設置區域設置的請求......無法被尊重

#parameter settings 
sometext <- "Mon, 14 Mar 2011 23:42:16 GMT" 
timeFormat <- "%a, %d %b %Y %H:%M:%S" 
timeZone <- "GMT" 
#get current locale 
loc <- Sys.getlocale("LC_TIME") 
#set british localization 
dummy <- Sys.setlocale("LC_TIME", "en_GB.UTF-8") 
#parse datetime string 
time <- strptime(sometext, format = timeFormat, tz= timeZone) 
#set local back 
dummy <- Sys.setlocale("LC_TIME", loc) 

不幸的是,使用該功能時,我的一個同事得到以下警告:

In Sys.setlocale("LC_TIME", "en_GB.UTF-8") : 
OS reports request to set locale to "en_GB.UTF-8" cannot be honored 

在我的電腦一切正常。 執行此任務的方式是否更好(並且與已安裝的R本地化無關)?通常我想使用strptime,因爲它允許非常靈活的解析日期時間字符串。

回答

8

我很確定你的大學計算機上沒有安裝「en_GB.UTF-8」語言環境。最簡單的方法可能是安裝它:)好吧,這對每個操作系統都不是微不足道的。

其他選項可以使用可在每臺計算機上找到的標準區域設置。由於您添加的示例沒有顯示特殊格式,因此您可以嘗試將LC_TIME設置爲C,這也適用於Linux和Windows。用那個語言環境,你給出的例子將像魅力一樣工作。請參閱:

> Sys.setlocale("LC_TIME", "C") 
> strptime("Mon, 14 Mar 2011 23:42:16 GMT", format = "%a, %d %b %Y %H:%M:%S", tz="GMT") 
[1] "2011-03-14 23:42:16 GMT" 

或者否則你應該改變你的數據 - 例如爲:寫一個簡短的功能替代所有week-和幾個月的名字標準字符串和重組導入的字符串標準的。

+0

我已經用sometext和timeformat的例子編輯了這個問題。因爲語言環境的安裝不是真的依賴於操作系統,因此其他一些選項會很好... – user625626 2011-03-17 22:29:50

+0

@ user625626:感謝您的更新,並將我的注意力指向了那裏。我修改了我的答案,並希望這可以幫助。 – daroczig 2011-03-17 23:11:23

+0

jep - 它適用於linux和windows - 非常感謝你! – user625626 2011-03-17 23:27:58

1

我試過你的代碼在我的Windows機器上,並得到相同的錯誤。作爲參考,Sys.getlocale的結果(「LC_TIME」):

> Sys.getlocale("LC_TIME") 
[1] "English_United Kingdom.1252" 

我懷疑這可能是一個相當標準的語言環境。

但我也懷疑解決此問題的更好方法是使用軟件包lubridate中的某些功能,這使得使用日期很容易。

在你的問題中,你沒有給出足夠的細節,但是我猜測「sometext」採用了特定的預期格式,例如DMY或YMD。 Lubridate提供了以任何指定格式解析日期的函數,例如dmy(),ymd(),mdy() - 你得到的圖片。

如果您提供有關您真實問題的更多詳細信息,我們可能會提供更具體的幫助。

+0

對不起,我使用sometext和timeformat的示例編輯了我的問題。我會看看潤滑,謝謝你的提示! – user625626 2011-03-17 22:31:28

+0

不幸的是,lubricate在其parse_date函數中也使用了strptime - 所以在這方面沒有任何幫助:-( – user625626 2011-03-17 23:01:43