python - 将自然语言日期转换为日期时间对象 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 上写作。任何建议表示赞赏。
解决方案
推荐阅读
- batch-file - 如何在“set / p”下显示文本
- python - 如何在 Python 中计算信号的日间稳定性?
- docker - 带有 selenium 和 docker 的 Github Action
- xamarin - 如何在 Xamarin Forms 或 Xamarin IOS 上查询 Google Fit 数据
- matplotlib - 代码正在运行,但 vs 代码终端显示语法错误
- javascript - 如何使用 Apache ECharts 使用 encode 创建堆叠折线图
- android - 嵌套 RecyclerView 和 MVVM ,点击子项
- android - “当用户从适配器转到另一个片段或活动时,在 android Paging 适配器中恢复滚动位置”问题
- python - 谁能向我解释为什么我的代码没有向终端返回任何内容
- jquery - 无法让 find() 或任何 jquery 标准选择器工作