Python不规范的日期字符串处理类


Posted in Python onJune 10, 2014

我分析了形如19920203、199203、1992.02.03、1992.02、1992-02-03、1992-02、920203时间格式特征,列出了正则表达式如下:

^((?:19|20)?\d{2})[-.]?((?:[0-1]?|1)[0-9])[-.]?((?:[0-3]?|[1-3])[0-9])?$

当然这个表达式还不是很完善,只能做简单的切割,不能判断日期的合法性,关于日期是否合法,我还是交给Python的时间功能来处理吧。

根据上面的正则表达式,我写的DateParser类如下:

import re
import datetime# ***************************************************
# *
# * Description: 非标准的日期字符串处理
# * Author: wangye  <pcn88 at hotmail dot com>
# *
# ***************************************************
class DateParser(object):
    def __init__(self):
        self.pattern = re.compile(
        r'^((?:19|20)?\d{2})[-.]?((?:[0-1]?|1)[0-9])[-.]?((?:[0-3]?|[1-3])[0-9])?$'
        )
    def __cutDate(self, date, flags):
        y = date.year
        m = date.month if flags[1] else 1
        d = date.day if flags[2] else 1
        return datetime.date(y, m, d)
    def __mergeFlags(self, flags1, flags2):
        l = []
        length = min(len(flags1), len(flags2))
        for i in range(0, length):
            if flags1[i] and flags2[i]:
                l.append(True)
            else:
                l.append(False)
        return l
    def parse(self, strdate):
        """
        描述:时间解析方法。
        参数:strdate 要分析的时间字符串,比如目标时间类型datetime(1992, 2, 3)
              可以被解析的是下述字符串之一:
            19920203 
            199203
            1992.02.03
            1992.02
            1992-02-03
            1992-02
            920203
        返回值:
            如果成功
            元组(datetime, flags),其中datetime表示转换完成的合法时间,
        flags是标志位,表示有效位数,比如199202实际转换了年和月,日没有,
        但是本函数将默认返回1日,但是flags将表示为(True, True, False),
        前面两个True分别表示年和月被转换,最后一个False表示日没有被转换。
            如果失败
            返回None。
        """
        m = self.pattern.match(strdate)
        flags = [False, False, False]
        if m:
            matches = list(m.groups())
            flags = list(map(lambda x:True if x!=None else False, matches))
            results = list(map(lambda x:int(x) if x!=None else 1, matches))
            # results = list(map(lambda x:1 if x==None else x, results))
            if results[0]<100:
                if results[0]>9:
                    results[0] += 1900
                else:
                    results[0] += 2000
            return (datetime.date(results[0], results[1], results[2]), flags)
        else:
            return None
    def convert(self, strdate, format):
        """
        描述:转换日期为指定格式。
        参数:strdate 同parse方法的strdate参数。
              format Python时间格式标识,同datetime.date.strftime格式化标识。
        返回值:
            如果成功,返回指定format格式的时间字符串。
            如果失败,返回None。
        """
        date = self.parse(strdate)
        if date:
            date = date[0]
            return datetime.date.strftime(date, format)
        else:
            return None
    def compare(self, strdate1, strdate2):
        """
        描述:比较两个日期。
        参数:strdate1 和 strdate2 同parse方法的strdate参数
        返回值:
            可以是下列值之一
            -4  strdate1 无效,  strdate2 有效
            -3  strdate1 有效,  strdate2 无效
            -2  strdate1 和 strdate2 无效
            -1  strdate1 < strdate2
             0  strdate1 = strdate2
             1  strdate1 > strdate2
        """
        date1,flags1 = self.parse(strdate1)
        date2,flags2 = self.parse(strdate2)
        if date1 == None and date2 != None:
            return -4
        if date1 != None and date2 == None:
            return -3
        elif date1 == None and date2 == None:
            return -2
        flags = self.__mergeFlags(flags1, flags2)
        date1 = self.__cutDate(date1, flags)
        date2 = self.__cutDate(date2, flags)
        if date1>date2:
            return 1
        elif date1<date2:
            return -1
        else:
            return 0

下面举几个例子供大家参考:

>>> DateParser().parse("19860126")
(datetime.date(1986, 1, 26), [True, True, True])
>>> DateParser().parse("199111")
(datetime.date(1991, 11, 1), [True, True, False])
>>> DateParser().parse("1991")
(datetime.date(1919, 9, 1), [True, True, True])
>>> DateParser().parse("8511")
(datetime.date(1985, 11, 1), [True, True, False])
>>> DateParser().convert("19911101", "%Y * %m * %d")
'1991 * 11 * 01'
>>> DateParser().convert("1990.1.01", "%Y.%m.%d")
'1990.01.01'
>>> DateParser().compare("1992.2", "19922")
0
>>> DateParser().compare("1992.2", "1956.03.1")
1
Python 相关文章推荐
python写的一个文本编辑器
Jan 23 Python
python通过floor函数舍弃小数位的方法
Mar 17 Python
Python程序中用csv模块来操作csv文件的基本使用教程
Mar 03 Python
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
Python编程之string相关操作实例详解
Jul 22 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
tensorflow对图像进行拼接的例子
Feb 05 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
解决Django Haystack全文检索为空的问题
May 19 Python
Python3压缩和解压缩实现代码
Mar 01 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 #Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 #Python
Python使用htpasswd实现基本认证授权的例子
Jun 10 #Python
python网络编程学习笔记(10):webpy框架
Jun 09 #Python
You might like
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
php中的常用魔术方法总结
2013/08/02 PHP
Js切换功能的简单方法
2010/11/23 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
vue中v-model动态生成的实例详解
2017/10/27 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
从vue源码看props的用法
2019/01/09 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
Swift中的协议(protocol)学习教程
2016/07/08 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
python3获取当前目录的实现方法
2019/07/29 Python
python 实现return返回多个值
2019/11/19 Python
python 变量初始化空列表的例子
2019/11/28 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
如何解决安装python3.6.1失败
2020/07/01 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
Python 里最强的地图绘制神器
2021/03/01 Python
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
毕业生求职简历的自我评价
2013/10/07 职场文书
保险公司晨会主持词
2014/03/22 职场文书
店长岗位职责
2015/02/11 职场文书
公务员年终个人总结
2015/02/12 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang