मेरे पास तार के रूप में संग्रहीत तिथियों का एक वेक्टर है, इनमें से कुछ YYYY-mm-dd प्रारूप में हैं और कुछ YYYY-dd-mm प्रारूप में हैं। मुझे यह पता लगाने की आवश्यकता है कि इन्हें तिथियों के रूप में कैसे परिवर्तित किया जाए। सौभाग्य से, YYYY-dd-mm प्रारूप में सभी उदाहरण किसी भी महीने के 12 दिन के बाद के होते हैं, इसलिए उन्हें आसानी से पहचाना जा सकता है।
कोशिश की है
dates <- c("2017-12-31","2017-12-30","2017-29-12","2017-28-12")
dates <- as.Date(dates, format = c("%Y-%m-%d","%Y-%d-%m"))
निम्नलिखित लौटा रहा है:
[1] "2017-12-31" "2017-12-30" NA NA
4 जवाब
lubridate
से parse_date_time
का उपयोग करें और कई प्रारूपों को पास करें जिन्हें आपकी तिथि ले सकती है।
dates <- c("2017-12-31","2017-12-30","2017-29-12","2017-28-12")
as.Date(lubridate::parse_date_time(dates, c('ymd', 'ydm')))
#[1] "2017-12-31" "2017-12-30" "2017-12-29" "2017-12-28"
यह अन्य उत्तरों की तरह पहले ymd
को वरीयता देता है और यदि यह तिथि की पहचान नहीं कर सकता है तो ydm
प्रारूप के लिए जाता है और जांचता है।
यदि आप चाहते हैं कि YMD डिफ़ॉल्ट हो, और YDM ऐसा कुछ भी हो जो काम नहीं करता है, तो पहले YMD का उपयोग करें और फिर वापस जाएं और किसी भी परिणाम के साथ फिर से प्रयास करें जो लापता मान उत्पन्न करता है:
result = as.Date(dates, format = "%Y-%m-%d")
result[is.na(result)] = as.Date(dates[is.na(result)], format = "%Y-%d-%m")
result
# [1] "2017-12-31" "2017-12-30" "2017-12-29" "2017-12-28"
यह मुझे परेशान करता है, आप मान रहे हैं कि कोई भी तारीख जहां महीने और दिन दोनों की संख्या 13 से कम है, वाईएमडी हैं ... मैं बहुत अच्छे कारण के बिना यह धारणा नहीं बनाऊंगा।
यहाँ थोड़ा लंबा दृष्टिकोण है।
# sample date
dates <- c("2015-02-23","2015-02-12","2015-18-02","2015-25-02")
# libraries
library(testit) #for has_warning
library(lubridate) #for date functions
यह फ़ंक्शन तिथियों को सही करेगा।
correct_dates = function(dates)
{
dates_new = character()
for(i in 1:length(dates))
{
#print(i)
if(has_warning(day(ydm(dates[i]))>12))
{dates_new = append(dates_new, ymd(dates[i]))}
else
{dates_new = append(dates_new, ydm(dates[i]))}
}
return(dates_new)
}
परिणाम की जाँच
> dates
[1] "2015-02-23" "2015-02-12" "2015-18-02" "2015-25-02"
> correct_dates(dates)
[1] "2015-02-23" "2015-12-02" "2015-02-18" "2015-02-25"
as.Date
का उपयोग करते हुए एक आधार R विकल्प
> apply(list2DF(lapply(c("%Y-%m-%d", "%Y-%d-%m"), as.Date, x = dates)), 1, na.omit)
[1] "2017-12-31" "2017-12-30" "2017-12-29" "2017-12-28"