Python Cookbook-3.7 日期的模糊查询

任务

程序需要读取并接受一些并不符合标准的“yyyy,mm,dd”datetime格式

解决方案

第三方 dateutil.parser 模块给出了一个简单的解答:

import datetime
import dateutil.parser
def tryparse(date):
	# dateutil.parser需要一个字符串参数:根据一些例,我们
	#可以从4种“date”参数创建一个
	kwargs = {								#假设没有命名参数
		if isinstance(date,(tuple,list)):
			date = '.join([str(x) for x in date])#拼接序列
		elif isinstance(date,int):
			date = str(date)#将整数变为字符串
		elif isinstance(date,dict):
			kwargs = date#接受命名参数字典
			date = kwargs.pop('date')#带有一个'date'字符串
		try:
			try:
				parsedate = dateutil.parser.parse(date,**kwargS)
				print('Sharp %r -> %s' % (date.parsedate))
			except ValueError:
				parsedate = dateutil.parser.parse(date,fuzzy = True,**kwargs)
				print('Fuzzy %r -> %s' % (date.parsedate))
		except Exception,err:
		print('Try as I may,I cannot parse %r(%s)' % (date,err)
if __name__ == "__main__":
	tests = (
			"January 3,2003",#字符串
			"5,"Oct",55),#元组
			"Thursday,November 18",# 没有年的长字符串
			"7/24/04",#带斜线的字符串
			"24-7-2004",#欧式的字符串格式
			{'date':"5-10-1955","dayfirst":True},#包括了kwarg 的字典
			"5-10-1955",#日在前,无kwarg
			19950317,#非字符串
			"11AM on the 11th day of 11th month,in the year of our Lord 1945",
			)
	for test in tests:#测试日期格式
		tryparse(test)#尝试解析

讨论

dateutil.parser 的 parse 函数可以用于很多数据格式。本节代码中展示了其中的一部分。这个解析器可以处理英语的月名以及两位或者四位的年(带有一些限制)。如果不带名字参数调用 parse,它首先尝试用如下的顺序来解析字符串:mm-dd-yy。如果解析的结果不合逻辑,正如例子中的那样,它尝试解析“27-7-2004”这样的字符串,无果。最后它会尝试“yy-mm-dd”。如果传入了 dayfirst 或 yearfrst 这样的“关键字”(我们在测试中正是这样做的),parse 会试图根据关键字进行解析。本节的测试代码定义了解析器可能会碰到的一些边界测试用例,比如通过一个元组一个整数(ISO格式,无空格),甚至一个短语来传人日期。为了测试关键字参数,

本节的 tryparse 函数也接受一个字典作为参数,该函数找到“date”键对应的值作为解析的对象,并将其余部分作为关键字参数传递给 dateutil的解析器dateutil 的解析器能够提供一定程度的“模糊”解析,只要你能够给它一点提示以便确定各部分的处理方式,比如小时(测试中所用的短语包含了AM)。在正式的编写代码工作中,应该避免依赖模糊解析,或者做一些预处理工作,或者至少提供某种机制来检查需要解析的日期的准确性。

你可能感兴趣的:(#Python学习,python,服务器,开发语言)