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列表覆盖范围,可自行扩展该列表以适配更多格式。

日期统一与排序处理流程 原始日期列表 10条混合格式数据 格式解析 strptime 多格式尝试 4种日期模板 有效日期 datetime对象 无效数据 记录并跳过 升序排序 sort() 格式化 strftime 输出结果 YYYY-MM-DD 升序列表 无效数据列表 单独打印提示 解析失败的数据不参与排序,仅作记录提示