python 数据清洗之提取字符串中的日期

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

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. 可以实现提取日期和日期的任意组合,如年月, 年月日, 年月日+时间,时间
    … 待补充
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值