Python处理含特殊格式列的CSV,提取Timestamp的YYYY-MM-DD日期
解决CSV最后一列含嵌套JSON(带逗号)的Timestamp提取问题
这种混合了标准CSV列和带逗号嵌套JSON的格式确实容易让常规CSV解析工具卡壳,不过咱们可以针对性处理,核心思路是把最后一列单独当作完整JSON解析,避开里面的逗号干扰。下面给你几个Python实现的方案:
方案一:固定列数下的手动拆分(最直接)
既然你说其他列都是标准逗号分隔,只有最后一列乱,那可以利用字符串的split方法限制拆分次数,把前N列正常拆分,剩下的部分直接当作完整的JSON字符串:
import json from datetime import datetime # 假设你的CSV每行有4列(前3列是标准列,第4列是JSON) COLUMN_COUNT = 4 with open('your_data.csv', 'r', encoding='utf-8') as f: header = next(f) # 跳过表头行 for line_num, line in enumerate(f, start=2): line = line.strip() if not line: continue # 只拆分COLUMN_COUNT-1次,确保最后一部分是完整的JSON parts = line.split(',', COLUMN_COUNT - 1) if len(parts) < COLUMN_COUNT: print(f"警告:第{line_num}行列数不足,跳过") continue json_str = parts[-1] try: # 解析JSON evidence_data = json.loads(json_str) # 遍历所有EvidenceDetails条目提取Timestamp日期 for item in evidence_data.get('EvidenceDetails', []): timestamp = item.get('Timestamp') if not timestamp: continue # 两种提取日期的方式: # 方式1:直接切片(适合固定ISO8601格式) date_part = timestamp[:10] # 方式2:用datetime解析(更稳妥,兼容格式小变动) # dt = datetime.fromisoformat(timestamp.replace('Z', '+00:00')) # date_part = dt.strftime('%Y-%m-%d') print(f"提取到日期:{date_part}") except json.JSONDecodeError as e: print(f"第{line_num}行JSON解析失败:{str(e)}")
方案二:正则匹配提取最后一列JSON(适配列数不固定的情况)
如果不确定前面有多少列,或者怕拆分出错,可以用正则表达式匹配每行末尾的JSON结构(从{开始到行尾的}结束):
import re import json from datetime import datetime # 匹配行尾的完整JSON结构(假设JSON没有跨行) json_pattern = re.compile(r'\{.*\}$', re.DOTALL) with open('your_data.csv', 'r', encoding='utf-8') as f: next(f) for line_num, line in enumerate(f, start=2): line = line.strip() match = json_pattern.search(line) if not match: print(f"第{line_num}行未找到JSON部分,跳过") continue json_str = match.group() try: evidence_data = json.loads(json_str) # 提取日期逻辑和方案一一致 for item in evidence_data.get('EvidenceDetails', []): timestamp = item.get('Timestamp') if timestamp: date_part = timestamp[:10] print(f"提取到日期:{date_part}") except json.JSONDecodeError as e: print(f"第{line_num}行JSON解析失败:{str(e)}")
方案三:用Pandas批量处理(适合大数据量)
如果你的数据量较大,用Pandas可以更高效地批量处理:
import pandas as pd import json # 读取CSV,注意这里默认的逗号分隔会把最后一列拆坏,但我们可以后续修复 df = pd.read_csv('your_data.csv', header=0) # 假设最后一列的原始列名是'Unnamed: 3'(根据实际情况修改) last_col_name = df.columns[-1] # 把所有被错误拆分的列合并回原始JSON字符串 # 比如前3列是正常的,后面的列都是JSON的一部分 normal_cols = df.columns[:-1] df['full_json'] = df[last_col_name].apply(lambda x: str(x)) # 如果有多列被拆分,需要合并:df['full_json'] = df.iloc[:, 3:].apply(lambda row: ','.join(row.astype(str)), axis=1) # 解析JSON并提取日期 def extract_timestamp_dates(json_str): try: data = json.loads(json_str) dates = [] for item in data.get('EvidenceDetails', []): ts = item.get('Timestamp') if ts: dates.append(ts[:10]) return dates except: return [] df['timestamp_dates'] = df['full_json'].apply(extract_timestamp_dates) # 把提取的日期展开成单独行(可选) exploded_df = df.explode('timestamp_dates').drop(columns=['full_json']) print(exploded_df[normal_cols.tolist() + ['timestamp_dates']])
注意事项
- 确保最后一列的JSON是合法的:如果JSON里有转义引号或者跨行,可能需要先做预处理(比如处理换行符)
- 如果遇到JSON解析错误,可以打印出对应的行内容,排查格式问题
内容的提问来源于stack exchange,提问作者Alan Rainer
相关产品推荐
相关产品推荐

