You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:15:52