主要应用于日期类的数据清洗,
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 #若不能解析,则给出解析异常的返回值
目前可以应对我自己的应用场景, 预留可以扩展的思路
- 返回时间的格式将可以自定义, 此处没有实现
- 将时间戳转为可读时间格式的功能, 未实现
- 可以实现提取日期和日期的任意组合,如年月, 年月日, 年月日+时间,时间
… 待补充