मेरे पास तार के रूप में संग्रहीत तिथियों का एक वेक्टर है, इनमें से कुछ 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   
2
LJ Giff 14 जिंदा 2022, 04:26
ओह! शुक्रिया। प्रश्न अद्यतन किया है। दोनों दिनांक स्वरूपों को मान्यता प्राप्त करने के लिए अभी भी संघर्ष करना पड़ रहा है
 – 
LJ Giff
14 जिंदा 2022, 05:04

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 प्रारूप के लिए जाता है और जांचता है।

3
Ronak Shah 14 जिंदा 2022, 05:27

यदि आप चाहते हैं कि 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 से कम है, वाईएमडी हैं ... मैं बहुत अच्छे कारण के बिना यह धारणा नहीं बनाऊंगा।

2
Gregor Thomas 14 जिंदा 2022, 05:07

यहाँ थोड़ा लंबा दृष्टिकोण है।

# 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"
1
Harshvardhan 14 जिंदा 2022, 05:22

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"
0
ThomasIsCoding 14 जिंदा 2022, 15:44