如何在不修改其他列的前提下转换CSV文件中日期列的日期格式?
Python 自动转换CSV中所有日期列格式(mm/dd/yyyy → yyyy-mm-dd)
需要编写Python脚本处理CSV文件,自动识别所有符合mm/dd/yyyy格式的日期单元格,将其转换为yyyy-mm-dd格式,非日期列/单元格保持原样,最终将结果写入新文件。无法提前知晓日期列的数量和位置。
示例输入(test.csv)
name, dob, gender, joindate John, 10/21/2000, 1, 09/25/2022 Hannah, 12/31/1980, 2, 09/25/2022 Tom, 02/09/1999, 1, 09/25/2022 Alice, 02/05/1999, 2, 09/21/2022
期望输出(result.csv)
name, dob, gender, joindate John, 2000-10-21, 1, 2022-09-25 Hannah, 1980-12-31, 2, 2022-09-25 Tom, 1999-02-09, 1, 2022-09-25 Alice, 1999-02-05, 2, 2022-09-21
原代码的问题
原代码存在以下局限性:
- 仅硬编码处理第一列,无法识别其他位置的日期列
- 跳过了表头但未写入结果文件,导致输出缺少表头
- 无异常处理,遇到非日期格式单元格直接抛出错误终止运行
- 手动调用
close()方法,而with语句已经自动处理文件关闭,属于冗余操作
修复后的代码
import csv from datetime import datetime def convert_date_format(cell_value): """尝试将mm/dd/yyyy格式的字符串转换为yyyy-mm-dd,失败则返回原内容""" try: # 先去除可能的前后空格 cleaned_value = cell_value.strip() # 解析日期并转换格式 date_obj = datetime.strptime(cleaned_value, '%m/%d/%Y') return date_obj.strftime('%Y-%m-%d') except (ValueError, TypeError): # 不是目标格式的日期,返回原内容 return cell_value # 处理CSV文件 with open('test.csv', 'r', newline='') as source_file, open('result.csv', 'w', newline='') as result_file: reader = csv.reader(source_file) writer = csv.writer(result_file) # 写入表头 header = next(reader) writer.writerow(header) # 处理每一行数据 for row in reader: # 对每个单元格尝试转换日期格式 converted_row = [convert_date_format(cell) for cell in row] writer.writerow(converted_row)
代码说明
- 日期转换函数:
convert_date_format函数负责单个单元格的格式判断与转换,通过try-except捕获解析失败的情况,确保非日期内容不受影响 - 表头处理:使用
next(reader)读取表头并直接写入结果文件,保留原文件的列结构 - 批量处理所有列:通过列表推导式遍历每行的所有单元格,自动识别并转换符合格式的日期
- 文件操作优化:使用
with语句管理文件上下文,自动处理文件打开/关闭,避免资源泄漏 - 空格处理:转换前去除单元格前后空格,兼容示例中日期值带空格的情况
运行该脚本后,即可得到符合要求的result.csv文件。
内容的提问来源于stack exchange,提问作者Orange Pumpkin
相关产品推荐
相关产品推荐

