2011-03-17 7 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 

अपने कंप्यूटर सब कुछ पर ठीक काम करता है। क्या इस कार्य को करने का एक बेहतर तरीका है (और स्थापित आर स्थानीयकरण से स्वतंत्र)? आम तौर पर मैं स्ट्रेटटाइम का उपयोग करना चाहता हूं क्योंकि यह डेटाटाइम तारों को पार्स करने का एक बहुत ही लचीला तरीका है।

उत्तर

8

मुझे पूरा यकीन है कि आपके कॉलेज के कंप्यूटर पर "en_GB.UTF-8" लोकेल स्थापित नहीं है। इसे स्थापित करने का सबसे आसान तरीका :) अच्छा, यह हर ओएस के साथ तुच्छ नहीं है।

अन्य विकल्प एक मानक लोकेल का उपयोग करना हो सकता है जो हर कंप्यूटर पर पाया जा सकता है। चूंकि आपका जोड़ा गया उदाहरण कोई विशेष प्रारूप नहीं दिखाता है, तो आप LC_TIME को C पर सेट करने का प्रयास कर सकते हैं, जो कि लिनक्स और विंडोज के तहत भी काम करता है। उस लोकेल के साथ, आपका दिया गया उदाहरण एक आकर्षण की तरह काम करेगा। देखें:

> 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" 

या अन्यथा आप अपने डेटा को बदलने चाहिए - उदा .: मानक तार करने के लिए सभी सप्ताह और महीने का नाम स्थानापन्न और मानक वाले को आपके आयातित तार पुनर्गठन के लिए एक छोटी समारोह लिखें।

+0

मैंने प्रश्न को कुछ समय और समय प्रारूप के उदाहरण के साथ संपादित किया है। क्योंकि लोकेशंस की स्थापना वास्तव में ओएस निर्भर नहीं है कुछ अन्य विकल्प अच्छा होगा ... – user625626

+0

@ user625626: अद्यतन के लिए धन्यवाद और मेरे ध्यान को इंगित करने के लिए भी। मैंने अपना जवाब संशोधित किया और आशा भी की कि इससे मदद मिल सके। – daroczig

+0

जेप - यह लिनक्स और विंडोज़ पर काम करता है - बहुत बहुत धन्यवाद! – user625626

1

मैंने अपनी विंडोज मशीन पर अपना कोड आजमाया है और एक ही त्रुटि प्राप्त की है। संदर्भ के लिए, Sys.getlocale के परिणाम ("LC_TIME"):

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

मैं इस एक काफी मानक स्थान हो सकता है संदेह है।

लेकिन मुझे यह भी संदेह है कि इस समस्या का सामना करने का बेहतर तरीका पैकेज लुब्रिडेट में कुछ कार्यों का उपयोग करना है, जो तिथियों के साथ काम करना आसान बनाता है।

आप अपने प्रश्न में पर्याप्त विवरण नहीं देते हैं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन मुझे लगता है कि "कुछ समय" एक निश्चित अपेक्षित प्रारूप में है, जैसे डीएमवाई या वाईएमडी। लुब्रिडेट किसी निर्दिष्ट प्रारूप में दिनांकों को पार्स करने के लिए फ़ंक्शंस प्रदान करता है, उदा। डेमी(), ymd(), mdy() - आपको तस्वीर मिलती है।

यदि आप अपनी वास्तविक समस्या के बारे में अधिक जानकारी प्रदान करते हैं, तो हम अधिक विशेष रूप से सहायता करने में सक्षम हो सकते हैं।

+0

क्षमा करें, मैंने अपना प्रश्न कुछ समय और समय प्रारूप के उदाहरण के साथ संपादित किया है। मैं स्नेहन पर एक नज़र डालेंगे, टिप के लिए धन्यवाद! – user625626

+0

दुर्भाग्यवश लुब्रिकेट भी अपने parse_date फ़ंक्शन में स्ट्रिपटाइम का उपयोग करता है - इसलिए उस तरफ से कोई मदद नहीं :-( – user625626

संबंधित मुद्दे