首页 > 解决方案 > 将自然语言日期转换为日期时间对象 python

问题描述

我以任何可能格式的字符串形式接收输入作为输入,我必须将其转换为“yyyy-mm-dd”格式。有各种可用的库,但我找不到可以处理所有案例的人。

输入及其输出如下

seventh october  --> 2020-10-07 #Current Year
7th october      --> 2020-10-07 #Current Year
twenty fifth july--> 2020-07-25
twenty five july --> 2020-07-25
july 25          --> 2020-07-25

基本上所有可能的自然语言组合。

目前,我正在使用此代码来处理,但也有可能出现极端情况

weekday = {'monday' : 0, 'tuesday' : 1, 'wednesday' : 2, 'thursday' : 3, 'friday' : 4, 'saturday' : 5, 'sunday' : 6}
ordinal = { 'first' : 1,    'eleventh' : 11 , 'twenty-first' : 21,   'thirty-first' : 31, 'thirty first' : 31, 'twenty first' : 21, 'thirtyfirst' : 31, 'twentyfirst' : 21,
           'second' : 2,'twelfth' : 12, 'twenty-second' : 22, 'twenty second' : 22, 'twentysecond' : 22,
           'third'  : 3,    'thirteenth' : 13, 'twenty-third': 23, 'twenty third': 23, 'twentythird': 23,
           'fourth':4,      'fourteenth':14,        'twenty-fourth' : 24, 'twenty fourth'   : 24, 'twentyfourth'    : 24,
            'fifth' :5, 'fifteenth':15,     'twenty-fifth':25, 'twenty fifth':25, 'twentyfifth':25,
            'sixth' :6,     'sixteenth':16,     'twenty-sixth':26, 'twenty sixth':26, 'twentysixth':26,
            'seventh': 7,       'seventeenth':17,       'twenty-seventh':27, 'twenty seventh':27, 'twentyseventh':27,
            'eighth':8, 'eighteenth':18,        'twenty-eighth':28, 'twenty eighth':28, 'twentyeighth':28,
            'ninth':9,  'nineteenth':19,        'twenty-ninth'  :29, 'twenty ninth' :29, 'twentyninth'  :29,
            'tenth' : 10,   'twentieth' : 20 ,'thirtieth' : 30}
month = ['jan',
 'feb',
 'mar',
 'apr',
 'may',
 'jun',
 'jul',
 'aug',
 'sep',
 'sept'
 'oct',
 'nov',
 'dec',
 'january',
 'february',
 'march',
 'april',
 'june',
 'july',
 'august',
 'september',
 'october',
 'november',
 'december']

query_date = datetime.today()
def get_nearest_date(day):
    day = day.lower()
    NUMBER_WEEKDAY = 7
    if day == "yesterday":
        query_date = datetime.today() - timedelta(days=1)
    elif day == 'day before yesterday':
        query_date = datetime.today() - timedelta(days=2)
    elif day in weekday:
        delta_date = weekday[datetime.today().strftime("%A").lower()] - weekday[day]
        if delta_date < 0:
            delta_date = NUMBER_WEEKDAY + delta_date
        #print(delta_date)
        query_date = datetime.today() - timedelta(days=delta_date)
    else:
        try:
            query_date = dateutil.parser.parse(day)
        except Exception as e:
            try:
                is_date, proper_date = words_to_date(day)
                print(proper_date)
                query_date = dateutil.parser.parse(proper_date)
            except Exception as e:
                return "No Date Found"
    return query_date

def words_to_date(day):
    print(day)
    date_info = day.strip().split()
    print(date_info)
    if len(date_info) > 3:
        return False,"" #No conversion possible
    return does_date_exist(date_info)

def does_date_exist(date_info):
    index = -1
    date = -1
    month_name = ""
    print(date_info)
    for d in date_info:
        if d.strip() in month:
            month_name = d.strip()
            break
    
    date_info.remove(month_name)
    print(month_name,date_info)
    date_info = " ".join(date_info)
    
    #for i in range(len(date_info)):
    #    d = date_info[i].strip()
    if date_info in ordinal:
        date = ordinal[date_info]
    elif is_conversion_possible(date_info):
        date = w2n.word_to_num(date_info)
    
    if date != -1:
        return True, month_name + str(date)
    else:
        return False, " ".join(date_info)
    '''
    #print(index,date)
    date_info[index] = date
    #print(date_info,"pranjal")
    #print(" ".join(str(x) for x in date_info))
    if index != -1:
        date_info[index] = date
        date = " ".join(str(x) for x in date_info)
        return True,date
        pass
    '''
    

def is_conversion_possible(date_info):
    try:
        w2n.word_to_num(date_info)
        return True
    except Exception:
        return False

对不起,如果写问题的方式不正确。这是第一次在 StackOverflow 上写作。任何建议表示赞赏。

标签: pythondatetimecalendar

解决方案


推荐阅读