求助:CSV文件多日期行拆分至同行列及Python代码修复
解决CSV多日期拆分问题
核心问题是直接按逗号拆分会破坏长格式日期,正确思路是用正则表达式精准匹配两种日期格式,提取每行的所有完整日期后再扩展为新列。
实现步骤
编写正则表达式匹配两种日期格式:
- 短格式(如
31-Mar-24):\d{2}-[A-Za-z]{3}-\d{2} - 长格式(如
Nov 21, 2024):[A-Za-z]{3} \d{2}, \d{4}
组合后的匹配规则:r'(\d{2}-[A-Za-z]{3}-\d{2}|[A-Za-z]{3} \d{2}, \d{4})'
- 短格式(如
读取CSV每行数据,用
re.findall()提取所有日期将提取到的日期按顺序转为
date1、date2等新列,与原行数据合并
基于原生csv模块的代码示例
import csv import re # 定义日期匹配正则 date_pattern = re.compile(r'(\d{2}-[A-Za-z]{3}-\d{2}|[A-Za-z]{3} \d{2}, \d{4})') # 读取原CSV并处理 with open('input.csv', 'r', newline='', encoding='utf-8') as infile, \ open('output.csv', 'w', newline='', encoding='utf-8') as outfile: reader = csv.DictReader(infile) # 先遍历一次获取最大日期数量,确保输出列完整 rows = list(reader) max_dates = max(len(date_pattern.findall(row['dates'])) for row in rows) fieldnames = reader.fieldnames + [f'date{i+1}' for i in range(max_dates)] writer = csv.DictWriter(outfile, fieldnames=fieldnames) writer.writeheader() for row in rows: dates = date_pattern.findall(row['dates']) # 给当前行添加date1、date2...字段 for i, date in enumerate(dates): row[f'date{i+1}'] = date # 补全缺失的date列(行内日期数少于最大数时) for i in range(len(dates), max_dates): row[f'date{i+1}'] = '' writer.writerow(row)
基于pandas的简化实现(更高效)
如果熟悉pandas,代码会更简洁:
import pandas as pd import re date_pattern = re.compile(r'(\d{2}-[A-Za-z]{3}-\d{2}|[A-Za-z]{3} \d{2}, \d{4})') df = pd.read_csv('input.csv') # 提取所有日期并转为多列 date_cols = df['dates'].apply(lambda x: pd.Series(date_pattern.findall(x))) # 重命名列名为date1、date2... date_cols.columns = [f'date{i+1}' for i in date_cols.columns] # 合并原数据和新日期列 result_df = pd.concat([df, date_cols], axis=1) # 保存结果 result_df.to_csv('output.csv', index=False)
注意事项
- 正则表达式可根据实际日期格式微调(比如月份缩写长度、日期是否为1位数字)
- 如果有其他日期格式,只需在正则中添加对应的匹配规则即可
内容的提问来源于stack exchange,提问作者Camol1
相关产品推荐
相关产品推荐

