ChatGPT 把你的 CSV / Excel 数据看错了

数字算错、表头错位、日期颠倒。强制走 analysis tool、显式声明本地化格式、核验行数——三步拿到准确结果。

对数据文件,ChatGPT 有两条路:把文件当纯文本读(直接抽几行”目测”汇总),或者调用 analysis tool(Code Interpreter / Advanced Data Analysis)真正跑 Python。走哪条路对准确率影响巨大——文本路径只能给你大致感觉,做求和 / 计数 / 透视一律会错。本地化、编码、合并单元格这些坑会让 Python 路径也出错,所以光”强制走代码”还不够。

最快修复: 开一个新对话,传上文件,prompt 开头写 Use the analysis tool.,再跟一句 Print df.shape, df.dtypes, and df.head() before computing anything.。如果回复里仍然没有 Analyzed 折叠块,说明它走的是文本路径,就是下面的原因 #1;如果它跑了 Python 但数字还是错,那基本是原因 #2(本地化)或 #3(编码)。

你属于哪一类

症状最可能的原因跳到
回复里没有 Analyzed / python文本路径,没跑 Python原因 1
日期固定地错位(月 / 日互换)本地化(DD/MM vs MM/DD)原因 2
出现 ??、乱码、或多出来的列名编码 / BOM / 引号原因 3
出现 NaN 空洞、少行、读错 Sheet合并单元格 / 隐藏行 / 多 Sheet原因 4
大文件总数偏小聚合前被采样原因 5
代码跑了但答案就是错的模型写的 pandas 代码有问题原因 6

常见原因

按命中率从高到低:

1. 模型走的是文本抽取路径,没跑 Python

最常见。CSV / XLSX 传上去,模型直接读前几行做总结——没出现 python 代码块,没有 Analyzed 标记,也没有输出文件。看起来在”分析”,其实是在猜。

如何判断:回复里没有可展开的 Analyzed 折叠块(点开它能看到 Python 代码)。这个块不在,就说明 Code Interpreter 根本没跑。让它”用 analysis tool 重新算一遍”再对比结果。

2. 日期 / 数字本地化不一致

03/04/2026 在美国是 March 4,在欧洲是 April 3。1,234.56 在英美是一千二百多,在欧陆很多国家写成 1.234,56 才是这个数。模型默认用美式,欧式 CSV 的所有日期 / 金额都会错。

这里还有一个更隐蔽的坑:pandas 的日期推断是按列、但依赖行顺序的。如果 read_csv 把第一行读成合法美式日期(01/02/2026)就锁定 MM/DD,后面遇到一行只能解析成 DD/MM(13/02/2026)时会悄悄切换格式,却不回头重检前面那些行。结果你得到的列前半段按一种格式、后半段按另一种格式。解法是别让 pandas 猜:传 dayfirst=True 或显式 format=

如何判断:让它”打印 Date 列前 5 行原始值 + 解析后的 datetime”。年份对了但月日反了、或者只有部分行反了,就是这条。

3. CSV 编码 / 引号 / BOM 异常

Excel 普通的”另存为 CSV”默认用系统代码页(中文 Windows 是 GBK,美 / 欧是 Windows-1252),不是 UTF-8。带中文 / 欧元符号会变成 ?? 或乱码。字段里有逗号却没加引号,会把后面每一列都顶错位。文件头的 BOM()会让第一个列名变成 name,于是 df["name"] 直接报 KeyError

如何判断:让它”打印 columns 列表 + 第一行的 raw bytes”。出现 ? 字符、列名带  前缀、或列数和你预期对不上,都是编码 / 引号问题。

4. Excel 隐藏行、合并单元格、多 Sheet

合并单元格会把值塞进左上角那一格,其余位置变 NaN。隐藏行 pandas 默认照样读出来(所以你以为删掉的行其实还在总数里)。多 Sheet 文件不指明 sheet_name 时只读第一个,你可能整篇都在分析错的那一页。

如何判断:让它跑 pd.read_excel(file, sheet_name=None).keys() 列出所有 Sheet,再打印 df.shape 对照 Excel 里看到的行 / 列数。

5. 大文件被采样后聚合

analysis tool 对 CSV / 表格的单文件上限大约是 50MB(截至 2026 年 6 月——列数上千的高密度文件远不到这个体积就可能卡住),行数到百万级时容器还可能内存溢出。一旦如此,模型有时只读前 N 行就开始算,不告诉你它在采样。

如何判断:让它打印 len(df),对照文件真实行数(本地 wc -l,或者用文件大小估行数)。数字偏小就是采样或截断了。

6. 模型写的 Python 代码本身错

即使跑了 Python,代码也是模型生成的。df.groupby('region').sum() 看起来对,但如果金额列因为原因 #3 进来时是字符串,求和要么为空、要么把文本拼在一起。模型偶尔还会用已废弃的 pandas 写法(比如 infer_datetime_format=True,pandas 2.0 已移除),直接报错或行为异常。

如何判断:高风险任务都让它把代码贴出来,手算一行输出和原始数据核对一遍。

动手前先确认

  • 确认问题出现在普通对话、Project,还是 Custom GPT;analysis tool 在三者里的可用性和上限不同,Free 用户配额尤其紧。
  • 在 picker 里选对模型。截至 2026 年 6 月,picker 是 Instant / Thinking / Pro(都是 GPT-5.5;o3 和 GPT-5.2 一线已在 2026 年中前后从 ChatGPT 下线)。Thinking 写的分析代码更可靠、支持全部工具;Instant 在临界 prompt 上可能悄悄走文本路径。
  • 复现前把当前对话复制一份,避免历史污染下一次诊断。
  • 确认订阅级别:Free / Go / Plus / Business / Enterprise 在 analysis tool 配额、单文件大小、执行时长上限上都不一样。

需要收集的信息

  • 文件类型(csv / xlsx / tsv / json)、大小(MB)、总行数、列数、是否含非 ASCII / 欧元符号 / 日期。
  • 编码:本地用 file -I data.csv 看是 utf-8 / utf-16 / windows-1252。
  • 完整 prompt 文案 + ChatGPT 回复;特别记录”回复里有没有 Analyzed 折叠块”。
  • 当前模型(Instant / Thinking / Pro)、analysis tool 是否开启(Thinking 默认开;Instant 支持但可能跳过)。
  • 一个具体错误的例子:你期望 X、它返回 Y、原始数据里的真值是 Z。

最短修复路径

按收益从高到低,前 3 步通常能修 80% 的问题。

Step 1:强制走 analysis tool,先看 schema

开新对话,把模型切到 Thinking,用这个 prompt 模板:

Use the analysis tool. Load `data.csv` into pandas, reading every column
as a string first (dtype=str) so nothing is silently coerced.
Print:
1. df.shape
2. df.dtypes
3. df.head()
4. For any date column, parse it with an explicit format and print the
   first 3 parsed values next to the raw strings.

After confirming the schema, compute: <your real question>

先把每一列都按字符串读进来,能防止 pandas 在你还没看到数据前就乱猜类型。这一步会暴露大部分格式问题,避免你拿错的 dtype 去做后续计算。

Step 2:日期 / 小数本地化显式声明

The Date column is DD/MM/YYYY (European format) — parse with dayfirst=True
or format="%d/%m/%Y", and do NOT let pandas auto-infer (it switches format
mid-column and corrupts earlier rows).
The Amount column uses a comma as the decimal separator (e.g. "1.234,56" =
1234.56) — strip thousands separators before converting to float.

不要省这一段——本地化错误是无声的,输出看起来正常但数字全错。

Step 3:Excel 转 CSV,干掉合并单元格

上传前在本地处理一遍:

  1. 选中所有合并单元格 → 取消合并 → 把重复值填回去。
  2. 取消所有隐藏行 / 列。
  3. 另存为 → CSV UTF-8 (Comma delimited)——不是默认那个 “CSV”,那个用的是你的系统代码页。
  4. 一行表头,无空行。

或者用 Python 在本地预处理:

import pandas as pd
df = pd.read_excel("source.xlsx", sheet_name="Sheet1")
df.to_csv("clean.csv", index=False, encoding="utf-8")

Step 4:核验行数 + 抽样验算

每次分析末尾追加:

Print:
- Total rows read: len(df)
- Non-null count per column
- Sanity check: pick one row from the result, find it in the raw data,
  and confirm the math matches.

如果 len(df) 小于本地 wc -l 得到的真实行数,就是它采样或截断了。让它重新完整读一次文件,或者拆文件分批(Step 6)。

Step 5:把代码贴出来人工 review

高风险任务(财务报表、A/B 测试结论、对客户报的数):

Show me the exact pandas code you used, with comments.

读一遍 groupby 的列、聚合函数、过滤条件。比让模型再算一遍可靠得多。

Step 6:超大文件先本地切

文件接近或超过约 50MB 的 CSV 上限(或超过 100 万行)时,先本地切片再上传:

# 按行切 CSV
split -l 100000 large.csv part_
# 或者只取部分列
csvcut -c "date,amount,region" large.csv > slim.csv

每段当成独立任务处理,最后自己聚合。

怎么确认已经修好

  • 开新对话上传同一个文件,问同一个问题,确认答案稳定(不是上次蒙对)。
  • 让 ChatGPT 输出一个总数 / 平均 / 分组结果,挑一行跟你手算或 Excel pivot 对,每一位都一致才算通过。
  • 让同事在他们账号里跑一遍同样的 prompt,确认不是只有你这个会话被修好。

如果还是没修好

  • 如果出现 Code Interpreter session expired 提示,说明沙箱超时了(大约闲置 15-30 分钟、或触发用量上限后),你传的文件也没了。在同一轮里重新上传并重发 prompt。
  • 把文件切到最小:100 行 CSV,只留出问题的几列,看最小用例能不能跑通。
  • 换格式:xlsx → csv、csv → tsv、CSV → Parquet,排除是不是某种格式的解析路径有 bug。
  • 把模型从 Instant 切到 Thinking;reasoning 模型写的分析代码更稳,也更不容易跳过工具。
  • 准备好原文件 + prompt + 模型 + 订阅级别截图,去 help.openai.com 提工单。

预防建议

  • 文件标准化模板:UTF-8、ISO 日期(YYYY-MM-DD)、点作小数点、一行表头、无合并单元格、无空行。
  • 每个数据任务都开头让它先 print(df.shape, df.dtypes, df.head())——schema bug 立刻暴露。
  • 数字相关任务一律强制 “use the analysis tool”,永远别信模型的口算。
  • 高风险任务建立”双重核对”习惯:让它贴代码 + 你手算一行验证 + 用 Excel pivot 再对一遍。
  • 反复分析的同类报表,把数据清洗代码写进一个 Custom GPT 的 instructions,保证 schema 处理始终一致。

常见问题

为什么 ChatGPT 说它分析了我的文件,可明明没有? 因为文本路径会从前几行拼出一段听起来很像样的总结,根本不跑代码。判别点就是缺少 Analyzed 折叠块。看不到它,就说明没跑 Python——强制走 analysis tool 重问一遍。

为什么只有一部分行的日期错了一个月? 这就是 pandas 那个依赖行顺序的推断坑(原因 #2):它在前几行锁定了美式格式,到中途又切成欧式,却不回头重检。强制 dayfirst=True 或显式 format=,别让它自动猜。

CSV 上传到底有多大的上限? 截至 2026 年 6 月,单个表格 / CSV 大约 50MB,列数上千的高密度文件远不到这个体积就可能失败。纯文本类文档受 token 限制(每个文件约 200 万 token),不是看原始体积。大 CSV 先在本地切再传。

Code Interpreter session expired——我的数据丢了吗? 沙箱是临时的,闲置一段时间或触发用量上限后就清空,你上传的文件和内存里的 DataFrame 都跟着没了。在同一条消息里重新上传文件并重发指令即可。

数据任务该用 Instant 还是 Thinking? 用 Thinking。它写的分析代码更可靠、支持全部工具,也更不容易悄悄走文本路径。Instant 留给快速、非数值的问题。

相关阅读

标签: #ChatGPT #ChatGPT 文件 #排查 #排查 #数据文件