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 相关文章推荐
深入理解Python3 内置函数大全
Nov 23 Python
python pandas 对时间序列文件处理的实例
Jun 22 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
Python高级特性与几种函数的讲解
Mar 08 Python
Python使用修饰器进行异常日志记录操作示例
Mar 19 Python
python SocketServer源码深入解读
Sep 17 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
python中如何打包用户自定义模块
Sep 23 Python
python中绕过反爬虫的方法总结
Nov 25 Python
python爬虫中采集中遇到的问题整理
Nov 27 Python
python 爬取小说并下载的示例
Dec 07 Python
利用python为PostgreSQL的表自动添加分区
Jan 18 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
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
javascript 检测浏览器类型和版本的代码
2009/09/15 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
js实现进度条的方法
2015/02/13 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
2015/07/17 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
js canvas仿支付宝芝麻信用分仪表盘
2016/11/16 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
2019/09/23 Javascript
Python 实现简单的电话本功能
2015/08/09 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
Keras实现DenseNet结构操作
2020/07/06 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
公司清洁工岗位职责
2013/12/14 职场文书
打架检讨书50字
2014/01/11 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android