主要应用于日期类的数据清洗,

dateutil模块 官方文档传送门

import re
from dateutil import parser

class GetStdTimeFormatter():
    """
    if_fail: 解析异常的返回值,默认返回None
    default_formatter: 默认返回的时间格式
    """
    def __init__(self, *args, if_fail=None, default_formatter="YYYY-MM-DD HH:mm:ss") -> None:
        self.if_fail = if_fail
        self.default_format = default_formatter
        self.year_location = '\d{4}[\.\/年-]{,3}'
        self.month_location = "\d{1,2}[\.\/月-]{,3}"
        self.day_location = "\d{1,2}[\.\/日-]{,3}"
        self.yyyymmdd = re.compile(''.join([self.year_location, self.month_location,self.day_location]))

    def check_timestring(self,value:str):
        if value != value or value is None:
            return None
        return re.sub('\s+', '', value)
  
    def get_formatter_by_yyyymmdd(self, val:str):
        val = self.check_timestring(val)
        if val is None:
            return self.if_fail
        val_list = re.findall(self.yyyymmdd, val)
        if val_list:
            try:
                value = val_list[0] # 若字符串有多个日期 ,则只取第0个(将可以优化)
                if re.search(r'年|月|日|-', value):
                    value = re.sub('[年月日-]', '/', value)  # 替换字符串中的年月日字符为'/'
                if re.search(r"\/{2,}",value):
                    value = re.sub("\/{2,}", '/', value)  # 替换多个年月日的间隔符的多个'/'为1个'/'
            except Exception as e:
                print(e)
                print(f"{val} 不能被解析")
            else:
                return parser.parse(value, yearfirst=True)
        else:
            return self.if_fail #若不能解析,则给出解析异常的返回值

目前可以应对我自己的应用场景, 预留可以扩展的思路

  1. 返回时间的格式将可以自定义, 此处没有实现
  2. 将时间戳转为可读时间格式的功能, 未实现
  3. 可以实现提取日期和日期的任意组合,如年月, 年月日, 年月日+时间,时间
    … 待补充
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐