R में स्ट्रिंग-टू-डेट रूपांतरण के लिए "मानक अस्पष्ट तारीख" प्रारूप क्या हैं?


93

कृपया निम्नलिखित पर विचार करें

$ R --vanilla

> as.Date("01 Jan 2000")
Error in charToDate(x) :
    character string is not in a standard unambiguous format

लेकिन यह स्पष्ट रूप से एक मानक स्पष्ट प्रारूप में है। त्रुटि संदेश क्यों?

इससे भी बदतर, एक अस्पष्ट तारीख को स्पष्ट रूप से चेतावनी या त्रुटि के बिना स्वीकार किया जाता है और फिर गलत तरीके से पढ़ा जाता है!

> as.Date("01/01/2000")
[1] "0001-01-20"

मैंने इस त्रुटि संदेश वाले [R] टैग में 28 अन्य प्रश्न खोजे और पाए हैं। सभी समाधान और समाधान के साथ प्रारूप को निर्दिष्ट करने से जुड़े, iiuc। यह सवाल इस मायने में अलग है कि मैं पूछ रहा हूँ कि मानक असंदिग्ध प्रारूप वैसे भी कहाँ परिभाषित हैं, और क्या उन्हें बदला जा सकता है? क्या सभी को ये संदेश मिलते हैं या यह सिर्फ मुझे है? शायद यह लोकेल से संबंधित है?

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

"[R] मानक असंदिग्ध प्रारूप" वाले 29 प्रश्न

> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252
[2] LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

13
as.Date.characterइनपुट की फ़ंक्शन परिभाषा को देखते हुए केवल इन दो प्रारूपों के लिए परीक्षण किया जाता है: "%Y-%m-%d"और "%Y/%m/%d"। अगर यह उनमें से एक से मेल खा सकता है तो ऐसा लगता है कि उसे "असंदिग्ध" समझा जा रहा है।
प्लेनैपस

7
@CarlWitthoft "क्या मैंने भी पढ़ा है" लगता है कि इसका उत्तर स्पष्ट रूप से स्पष्ट है ?as.Date। इससे कहां मदद मिलती है?
मैट Dowle

2
संभवतः "जनवरी 24 1949" और "24 जनवरी 1949" असंदिग्ध होंगे, लेकिन वे निश्चित रूप से एंग्लो-केंद्रित हैं। फिर भी 'महीना.बब' के लिए भी मूल्य हैं जो एंग्लो-केंद्रित हैं, इसलिए उन मामलों के लिए एक मामला बनाया जा सकता है जहां मामलों में मिलान किया जाता है: strptime(xx, f <- "%d $B %Y", tz = "GMT")या strptime(xx, f <- "%B $d %Y", tz = "GMT")लौटाए गए मान। (मैं यह नहीं कह रहा हूं कि month.abbडॉक्स के मिलान के बाद से इसका उपयोग% B के लिए किया जाता है क्योंकि मिलान लोकेल स्पेसिफिक है।)
IRTFM

6
@CarlWitthoft हम में से कुछ लोग अब और फिर से यात्रा करते हैं। नीचे होने के दौरान किक के लिए धन्यवाद। इस सवाल में मुझे कुछ चीजें सही लगीं: मैंने sessionInfo () को शामिल किया, मैंने खोजा, आपको बताया कि मैंने क्या खोजा और एक लिंक शामिल किया, मैंने इसे यथासंभव संक्षिप्त रखा। मैं के रूप में एक लाइन याद किया। Asate और तुम मुझे TFM उपचार दे। हम सब आप के रूप में हर समय के रूप में सही नहीं हो सकता।
मैट डॉवले

1
@MatthewDowle माफ करना अगर मैं मुश्किल से नीचे आया। मुझे लगता है कि फ्लैमोसिटी तब शुरू हुई थी जब आप "एक गरीब असहाय टुकड़े के प्रति असहाय" के साथ "एक यथोचित अच्छी तरह से शिक्षित मानव के लिए" अयोग्य थे। :-(
कार्ल विटथॉफ्ट

जवाबों:


66

यह प्रलेखित व्यवहार है। से ?as.Date:

प्रारूप: एक चरित्र स्ट्रिंग। यदि निर्दिष्ट नहीं किया गया है, तो यह पहले गैर-'NA 'तत्व पर' '% Y-% m-% d "' तो"% Y /% m /% d "" की कोशिश करेगा, और न तो काम करने पर त्रुटि देगा।

as.Date("01 Jan 2000")प्रारूप में सूचीबद्ध दो में से एक नहीं होने के कारण त्रुटि मिलती है। as.Date("01/01/2000")एक गलत उत्तर देता है क्योंकि तिथि ऊपर सूचीबद्ध दो प्रारूपों में से एक में नहीं है।

मैं "ISO-8601" का अर्थ "मानक असंदिग्ध" लेता हूं (भले ही as.Dateवह सख्त न हो, क्योंकि "% m /% d /% Y" ISO-8601 नहीं है)।

यदि आप इस त्रुटि को प्राप्त करते हैं, तो समाधान उस प्रारूप को निर्दिष्ट करना है, जिसमें आपकी तिथि (या डेटाटाइम्स) हैं, जिसमें वर्णित स्वरूपों का उपयोग करके ?strptime। यदि आपके डेटा में दिन / महीने के नाम और / या संक्षिप्त विवरण हैं, तो विशेष देखभाल का उपयोग करना सुनिश्चित करें, क्योंकि रूपांतरण आपके स्थान पर निर्भर करेगा (उदाहरणों को ?strptimeपढ़ें और पढ़ें ?LC_TIME)।


6
@BenBolker कैसे के बारे में "character string is not either %Y-%m-%d or %Y/%m/%d"?
मैट डॉवले

9
व्यवहार निश्चित रूप से ?as.Date(+1) में प्रलेखित है । हालांकि, त्रुटि संदेश "मानक अस्पष्ट प्रारूप" विडंबनापूर्ण अस्पष्ट है, जिसमें 23 पिछले प्रश्न उपस्थित होते हैं। एक अधिक प्रत्यक्ष त्रुटि संदेश जैसे, "प्रारूप मान्यता प्राप्त नहीं, प्रलेखन देखें" उपयोगकर्ता अनुभव में सुधार कर सकता है। इसके अलावा, मुझे विश्वास नहीं है कि "01/01/2000" ISO-8601 ("2000-01-01" ISO-8601) है, जो अस्पष्टता को जोड़ता है।
jthetzel

@jthetzel: आप सही कह रहे हैं, "01/01/2000" ISO-8601 नहीं है। मेरा मतलब था कि मैं व्यक्तिगत रूप से ISO-8601 को मानक, असंदिग्ध प्रारूप मानता हूं। और मैं मानता हूं कि as.Date"01/01/2000" के बारे में शिकायत नहीं करना त्रुटि संदेश के साथ असंगत है।
जोशुआ उलरिच

31

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

हां, अब है (2016 के अंत में), कभी भी पैकेज anytime::anydateसे धन्यवाद ।

ऊपर से कुछ उदाहरणों के लिए निम्नलिखित देखें:

R> anydate(c("01 Jan 2000", "01/01/2000", "2015/10/10"))
[1] "2000-01-01" "2000-01-01" "2015-10-10"
R> 

जैसा कि आपने कहा, ये वास्तव में असंदिग्ध हैं और बस काम करना चाहिए। और इसके माध्यम से anydate()वे करते हैं। बिना किसी प्रारूप के।


2
केवल यहाँ आया क्योंकि हमारे पास एक अपूर्ण प्रारूप के साथ तारीखों को पार्स करने की कोशिश कर रहे कुछ और का सवाल था । पूर्ण लोगों के लिए, अब हमारे पास कुछ है। मैं इससे काफी खुश हूं - यह एक कठिन सवाल था। और कहने की जरूरत नहीं है, के anytime()लिए भी उतना ही उपयोगी है POSIXct
डिर्क एडल्डबुलेटेल

बस कभी-कभी पैकेज का इस्तेमाल किया और यह काफी कुछ एनए को छोड़कर, आश्चर्यजनक रूप से काम किया। मैं वेक्टर के बाद ट्रिम () भाग गया, सब कुछ सही था।
कानूनन R

मैं इसे एक मीट्रिक टन भी उपयोग करता हूं!
डिर्क एडल्डबुलेटेल

कितना सरल लग रहा है! मैंने mm-dd (कोई yy) के स्ट्रिंग मानों वाले किसी कॉलम पर anydate () का उपयोग किया है। कॉलम में सभी <chr> मानों को सफलतापूर्वक <date> में बदल दिया गया था। दुर्भाग्य से, इसने वर्ष को '2020' के बजाय '1400' पर सेट किया। ¯_ (¯) _ / ¯
उल्लू

खैर, काफी नहीं। जैसा कि मैंने इस साइट पर कुछ अन्य प्रश्नों के उत्तर दिए हैं, mm-ddकोई तिथि नहीं है (न तो मिमी-यि या मिमी-य्य्य है)। आप यह नहीं कर सकते कि यह क्या नहीं है।
डिर्क एडल्डबुलेटेल

26

@JoshuaUlrich उत्तर के पूरक के रूप में, यहाँ फ़ंक्शन की परिभाषा है as.Date.character:

as.Date.character
function (x, format = "", ...) 
{
    charToDate <- function(x) {
        xx <- x[1L]
        if (is.na(xx)) {
            j <- 1L
            while (is.na(xx) && (j <- j + 1L) <= length(x)) xx <- x[j]
            if (is.na(xx)) 
                f <- "%Y-%m-%d"
        }
        if (is.na(xx) || !is.na(strptime(xx, f <- "%Y-%m-%d", 
            tz = "GMT")) || !is.na(strptime(xx, f <- "%Y/%m/%d", 
            tz = "GMT"))) 
            return(strptime(x, f))
        stop("character string is not in a standard unambiguous format")
    }
    res <- if (missing(format)) 
        charToDate(x)
    else strptime(x, format, tz = "GMT")
    as.Date(res)
}
<bytecode: 0x265b0ec>
<environment: namespace:base>

तो मूल रूप से यदि दोनों strptime(x, format="%Y-%m-%d")और strptime(x, format="%Y/%m/%d")फेंकता है तो NAइसे अस्पष्ट माना जाता है और यदि असंदिग्ध नहीं है।


6

वर्तमान प्रारूप को निर्दिष्ट किए बिना दिनांक परिवर्तित करने से यह त्रुटि आसानी से आपके सामने आ सकती है।

यहाँ एक उदाहरण है:

sdate <- "2015.10.10"

प्रारूप निर्दिष्ट किए बिना रूपांतरित करें:

date <- as.Date(sdate4) # ==> This will generate the same error"""Error in charToDate(x): character string is not in a standard unambiguous format""".

निर्दिष्ट प्रारूप के साथ परिवर्तित करें:

date <- as.Date(sdate4, format = "%Y.%m.%d") # ==> Error Free Date Conversion.

2

यह मेरे लिए पूरी तरह से काम करता है, इससे कोई फर्क नहीं पड़ता कि तारीख पहले कैसे कोडित की गई थी।

library(lubridate)
data$created_date1 <- mdy_hm(data$created_at)
data$created_date1 <- as.Date(data$created_date1)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.