2012-12-05 21 views
9

जब मैं निम्न प्रारूप में टाइमस्टैम्प को पार्स करने का प्रयास करता हूं: "Thu Nov 8 15:41:45 2012", केवल NA वापस आ गया है।strptime, as.POSIXct और as.Date वापस अप्रत्याशित NA

मै मैक ओएस एक्स, आर 2.15.2 और Rstudio 0.97.237 का उपयोग कर रहा हूं। मेरे ओएस की भाषा डच है: मुझे लगता है कि इसके साथ कुछ करने के लिए कुछ है।

जब मैं strptime कोशिश, NA दिया जाता है:

var <- "Thu Nov 8 15:41:45 2012" 
strptime(var, "%a %b %d %H:%M:%S %Y") 
# [1] NA 

न तो करता है as.POSIXct काम:

as.Date("Thu Nov 8 2012", "%a %b %d %Y") 
# [1] NA 
:

as.POSIXct(var, "%a %b %d %H:%M:%S %Y") 
# [1] NA 

मैं भी ऊपर, लेकिन %H:%M:%S घटकों के बिना स्ट्रिंग पर as.Date की कोशिश की

कोई विचार क्या मैं गलत कर सकता था?

+1

मैं उबंटू और आर बेस पर आपकी त्रुटि को पुन: उत्पन्न नहीं कर सकता। इसके अलावा, मेरे लिए, 'strptime'' POSIXct' टाइम ऑब्जेक्ट की बजाय 'POSIXlt' बनाता है। अंत में, 'as.POSIXct (var, format = ...)' का उपयोग करने का प्रयास करें और देखें कि क्या आपके पास अधिक भाग्य है या नहीं। – Justin

उत्तर

17

मुझे लगता है कि यह ठीक है जैसा आपने अनुमान लगाया है, strptime आपके लोकल की वजह से आपकी डेट-टाइम स्ट्रिंग को पार्स करने में विफल रहता है। आपकी स्ट्रिंग में संक्षिप्त सप्ताहांत (%a) और संक्षिप्त माह नाम (%b) दोनों शामिल हैं। ये समय विनिर्देशों ?strptime में वर्णित हैं:

Details

%a : Abbreviated weekday name in the current locale on this platform

%b : Abbreviated month name in the current locale on this platform.

"Note that abbreviated names are platform-specific (although the standards specify that in the C locale they must be the first three letters of the capitalized English name:"

"Knowing what the abbreviations are is essential if you wish to use %a , %b or %h as part of an input format: see the examples for how to check."

See also

[...] locales to query or set a locale.

locales के मुद्दे as.POSIXct, as.POSIXlt और as.Date के लिए भी प्रासंगिक है।

?as.POSIXct से

:

Details

If format is specified, remember that some of the format specifications are locale-specific, and you may need to set the LC_TIME category appropriately via Sys.setlocale . This most often affects the use of %b , %B (month names) and %p (AM/PM).

?as.Date से:

Details

Locale-specific conversions to and from character strings are used where appropriate and available. This affects the names of the days and months.


इस प्रकार, यदि काम करने के दिन और स्ट्रिंग में महीने के नामों as.POSIXctas.Date वर्तमान स्थान में उन, strptime, और से अलग स्ट्रिंग को सही ढंग से पार्स करने में विफल रहता है और NA वापस कर दिया जाता है। मेरी निजी स्थान के साथ

# First save your current locale 
loc <- Sys.getlocale("LC_TIME") 

# Set correct locale for the strings to be parsed 
# (in this particular case: English) 
# so that weekdays (e.g "Thu") and abbreviated month (e.g "Nov") are recognized 
Sys.setlocale("LC_TIME", "en_GB.UTF-8") 
# or 
Sys.setlocale("LC_TIME", "C") 

#Then proceed as you intended 
x <- "Thu Nov 8 15:41:45 2012" 
strptime(x, "%a %b %d %H:%M:%S %Y") 
# [1] "2012-11-08 15:41:45" 

# Then set back to your old locale 
Sys.setlocale("LC_TIME", loc) 

मैं प्रजनन कर सकते हैं अपने त्रुटि:

हालांकि, अगर आप इस मुद्दे locales बदलकर समाधान हो सकता है

Sys.setlocale("LC_TIME", loc) 
# [1] "fr_FR.UTF-8" 

strptime(var,"%a %b %d %H:%M:%S %Y") 
# [1] NA 
0

सिर्फ एक ही समस्या के साथ चारों ओर खिलवाड़ किया गया था, और पाया यह समाधान बहुत साफ होने वाला है क्योंकि सिस्टम सिस्टम में से किसी भी को मैन्युअल रूप से बदलने की आवश्यकता नहीं है, क्योंकि lubridate पैकेज में यह नौकरी करने वाला एक रैपर फ़ंक्शन है, और आपको केवलतर्क सेट करना है:

date <- c("23. juni 2014", "1. november 2014", "8. marts 2014", "16. juni 2014", "12. december 2014", "13. august 2014") 
df$date <- dmy(df$Date, locale = "Danish") 
[1] "2014-06-23" "2014-11-01" "2014-03-08" "2014-06-16" "2014-12-12" "2014-08-13" 
+2

"किसी भी सिस्टम सेटिंग्स को बदलने की जरूरत नहीं है" के बारे में, कृपया ध्यान दें कि 'lubridate' फ़ंक्शंस में 'लोकेल' तर्क केवल ऊपर दिए गए उत्तर में उल्लिखित चरणों का एक सुविधाजनक आवरण है: (1) वर्तमान लोकेल को सहेजें, (2) लोकेल बदलें, (3) मूल लोकेल पर वापस जाएं। कोड [यहां] जांचें (https://github.com/hadley/lubridate/blob/master/R/parse.r): 'orig_locale <- Sys.getlocale (" LC_TIME "); Sys.setlocale ("LC_TIME", लोकेल); on.exit (Sys.setlocale ("LC_TIME", orig_locale)) ' – Henrik