আর-এ স্ট্রিং-টু-ডেট রূপান্তরকরণের জন্য "স্ট্যান্ডার্ড অবিস্মরণীয় তারিখ" ফর্ম্যাটগুলি কী কী?


94

নিম্নলিখিত বিবেচনা করুন

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

এই ত্রুটি বার্তাটি সহ আমি [আর] ট্যাগে আরও ২৮ টি প্রশ্ন অনুসন্ধান করেছি এবং খুঁজে পেয়েছি। সমস্ত সমাধান এবং কার্যবিধির সাথে ফর্ম্যাট নির্দিষ্ট করে জড়িত, 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
@ কার্লউইথথফট "আমি কি এমন কি পড়েছিলাম" বলে মনে হয় উত্তরটি অন্ধভাবেই স্পষ্ট ?as.Date। এটি এর সাথে কোথায় সহায়তা করে?
ম্যাট ডাউল

4
যুক্তিযুক্তভাবে "24 জানু 1949" এবং "24 জানু 1949" দ্ব্যর্থহীন হবে তবে তারা অবশ্যই অ্যাংলো-কেন্দ্রিক। তবুও 'মাস.abb' এর মানও রয়েছে যেগুলি অ্যাংলো-কেন্দ্রিকও রয়েছে, সুতরাং সেই মানগুলির ক্ষেত্রে একটি ক্ষেত্রে মামলা তৈরি করা যেতে পারে যেখানে: strptime(xx, f <- "%d $B %Y", tz = "GMT")বা strptime(xx, f <- "%B $d %Y", tz = "GMT")ফিরে আসা মানগুলি। (আমি month.abb
ডাকে ম্যাচগুলি

6
@ কার্লউইথথফট আমাদের মধ্যে কয়েকজন এখন এবং বার বার ট্রিপ করে। আমি নিচে যখন লাথি জন্য ধন্যবাদ। এই প্রশ্নে আমি বেশ কয়েকটি জিনিস সঠিকভাবে পেয়েছি: আমি সেশন ইনফো () অন্তর্ভুক্ত করেছি, আমি অনুসন্ধান করেছি, আপনাকে আমি কী অনুসন্ধান করেছি এবং একটি লিঙ্ক অন্তর্ভুক্ত করেছি, আমি এটি যথাসম্ভব সচেতন রেখেছি। আমি এক লাইনে মিস করলাম? তারিখ এবং আপনি আমাকে টিএফএম ট্রিটমেন্ট দিন। আমরা সকলেই আপনার মতো নিখুঁত হতে পারি না।
ম্যাট ডাওল

4
@ ম্যাথেজডওলে দুঃখিত আমি যদি শক্ত হয়ে নেমে আসি। আমার মনে হয় আপনি যখন "একটি যুক্তিসঙ্গত সুশিক্ষিত মানুষের কাছে দ্ব্যর্থহীন" "" একটি অসহায় অসহায় কোডের কাছে অস্পষ্ট "হিসাবে বিভ্রান্ত হয়ে উপস্থিত হয়েছিলেন তখনই শিখার শুরু হয়েছিল I :-(
কার্ল উইথফট

উত্তর:


66

এটি নথিভুক্ত আচরণ। থেকে ?as.Date:

বিন্যাস: একটি অক্ষর স্ট্রিং। যদি নির্দিষ্ট না করা হয়, তবে এটি প্রথম 'অ-এনএনএ' উপাদানটিতে '"% Y-% m-% d"' এর পরে '"% Y /% m /% d"' চেষ্টা করবে এবং কোনওটি যদি কাজ না করে তবে ত্রুটি দেয়।

as.Date("01 Jan 2000")উপরের তালিকাভুক্ত দুটির মধ্যে ফর্ম্যাটটি একটিরও নয় কারণ একটি ত্রুটি এনে দেয়। as.Date("01/01/2000")একটি ভুল উত্তর দেয় কারণ তারিখটি উপরে তালিকাভুক্ত দুটি ফর্ম্যাটের একটিতে নেই।

আমি "আইএসও -8601" বোঝার জন্য "স্ট্যান্ডার্ড আনম্বিগিউস" নিই (যদিও as.Dateএটি কঠোর নয় যদিও "% এম /% ডি /% ওয়াই" আইএসও -8601 নয়)।

আপনি যদি এই ত্রুটিটি পান তবে সমাধানটি বর্ণিত ফর্ম্যাটগুলি ব্যবহার করে আপনার তারিখ (বা তারিখের সময়) যে ফর্ম্যাটটিতে রয়েছে তা নির্দিষ্ট করা ?strptime। আপনার ডেটাতে দিন / মাসের নাম এবং / বা সংক্ষিপ্ত বিবরণ উপস্থিত থাকলে বিশেষ যত্ন নেওয়ার বিষয়ে নিশ্চিত হন, কারণ রূপান্তরটি আপনার লোকেলের উপর নির্ভর করবে (উদাহরণ ?strptimeএবং দেখুনটি দেখুন ?LC_TIME)।


6
@ বেনবোলকার কীভাবে "character string is not either %Y-%m-%d or %Y/%m/%d"?
ম্যাট ডাউল

9
আচরণটি অবশ্যই অবশ্যই ++ এ নথিভুক্ত করা হয়েছে ?as.Date। যাইহোক, ত্রুটি বার্তা "স্ট্যান্ডার্ড দ্ব্যর্থহীন ফর্ম্যাট" বিদ্রূপজনকভাবে অস্পষ্ট, যা 23 টি পূর্ববর্তী প্রশ্নগুলি প্রমাণ করে। "ফর্ম্যাট স্বীকৃত নয়, ডকুমেন্টেশন দেখুন" এর মতো আরও সরাসরি ত্রুটির বার্তা ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে পারে। এছাড়াও, আমি বিশ্বাস করি না "01/01/2000" আইএসও -8601 ("2000-01-01" আইএসও -8601), যা অস্পষ্টতাকে যুক্ত করে।
jthetzel

@ জেথেজেল: আপনি ঠিক বলেছেন, "01/01/2000" আইএসও -8601 নয়। আমি বলতে চাইছিলাম যে আমি ব্যক্তিগতভাবে আইএসও -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()তাদের মাধ্যমে । বিন্যাস ছাড়াই।


4
কেবল এখানে এসেছিল কারণ আমাদের কাছে একটি অসম্পূর্ণ ফর্ম্যাট সহ তারিখগুলি বিশ্লেষণ করার চেষ্টা করার আরেকটি প্রশ্ন ছিল । সম্পূর্ণ জন্য, আমাদের এখন কিছু আছে। আমি এতে সন্তুষ্ট - এটি একটি উত্তেজনাপূর্ণ প্রশ্ন ছিল। এবং বলা বাহুল্য, anytime()এটিও সমানভাবে কার্যকর POSIXct
ডার্ক এডেলবুয়েটেল

কেবল যে কোনও সময় প্যাকেজটি ব্যবহার করেছে এবং এটি বেশ কয়েকটি এনএ ব্যতীত আশ্চর্যজনকভাবে কাজ করেছে। তারিখ ভেক্টরে আমি ছাঁটাই () চালানোর পরে, সমস্ত কিছুই নিখুঁত ছিল।
LawyeR

আমি এটি একটি মেট্রিক টনও ব্যবহার করি!
ডিস্ক এডেলবুয়েটেল

দেখতে খুব সহজ! আমি মিমি-ডিডি (কোনও ইয়াই) এর স্ট্রিং মান সহ কলামে যেকোন তারিখ () ব্যবহার করেছি। কলামের সমস্ত <chr> মান সফলভাবে <তারিখ> তে রূপান্তরিত হয়েছিল। দুর্ভাগ্যক্রমে, এটি বছরটিকে '2020 'এর পরিবর্তে' 1400 'এ সেট করেছে। ¯_ (ツ) _ / ¯
পেঁচা

ভাল, বেশ না। যেমন আমি এই সাইটের কয়েকটি অন্যান্য প্রশ্নের জবাব দিয়েছি, mm-ddতারিখটি নয় (মিমি-ওয়াই বা মিমি-ইয়াই নয়)। যা আছে তা আপনি পার্স করতে পারবেন না।
ডার্ক এডেলবুয়েটেল

26

@ জোশুয়াউলিচার উত্তরের পরিপূরক হিসাবে, এখানে ফাংশনটির সংজ্ঞা দেওয়া আছে 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.