3. 统一日期格式并排序
任务说明
给定一组来源不同、格式各异的日期字符串(如“2024/3/15”“15-04-2023”“2023.12.1”“2024年1月5日”等),需要将其统一转换为YYYY-MM-DD标准格式,并按日期升序输出。本案例使用Python标准库datetime实现,不依赖第三方包。
实现方案
核心思路是定义多种日期格式的解析规则,依次尝试匹配;若全部失败则标记为无法解析并跳过。解析成功后统一格式化为YYYY-MM-DD,最后按日期排序输出。
from datetime import datetime
# 待清洗的原始日期数据(模拟不同来源)
raw_dates = [
"2024/3/15",
"15-04-2023",
"2023.12.1",
"2024年1月5日",
"2022/11/30",
"01-08-2021",
"2023.5.20",
"2024年12月31日",
"not a date",
"2024/02/29" # 2024年为闰年,合法日期
]
# 支持的日期格式(按优先级排列)
date_formats = [
"%Y/%m/%d", # 2024/3/15
"%d-%m-%Y", # 15-04-2023
"%Y.%m.%d", # 2023.12.1
"%Y年%m月%d日", # 2024年1月5日
]
def parse_date(date_str):
"""尝试用多种格式解析日期,成功返回datetime对象,失败返回None"""
for fmt in date_formats:
try:
return datetime.strptime(date_str.strip(), fmt)
except ValueError:
continue
return None
# 解析并过滤无效数据
parsed_dates = []
invalid_dates = []
for item in raw_dates:
dt = parse_date(item)
if dt is not None:
parsed_dates.append(dt)
else:
invalid_dates.append(item)
# 按日期升序排序
parsed_dates.sort()
# 统一格式化为 YYYY-MM-DD
formatted_dates = [dt.strftime("%Y-%m-%d") for dt in parsed_dates]
# 输出结果
print("清洗后的日期(升序):")
for d in formatted_dates:
print(d)
if invalid_dates:
print("\n无法解析的无效数据:")
for bad in invalid_dates:
print(f" {bad}")
运行与验证
将上述代码保存为unify_dates.py,在Python 3环境中运行:
python unify_dates.py
预期输出如下(与代码逻辑严格一致):
清洗后的日期(升序):
2021-08-01
2022-11-30
2023-04-15
2023-05-20
2023-12-01
2024-01-05
2024-02-29
2024-03-15
2024-12-31
无法解析的无效数据:
not a date
判定标准:所有合法日期均转换为YYYY-MM-DD格式;输出按日期从早到晚排列;无法解析的字符串被单独列出且不影响有效数据的处理。若输入数据中的日期格式超出date_formats列表覆盖范围,可自行扩展该列表以适配更多格式。