如何防止Pandas读取Excel时将‘2004E205’类字符串转换为科学计数法
如何防止Pandas读取Excel时将‘2004E205’类字符串转换为科学计数法
我太懂这种抓狂的感觉了——明明指定了要读成字符串,结果带E的编码还是被转成了一串乱七八糟的长数字,完全没法用。咱们一步步把这个问题解决掉:
首先先揪出你代码里的一个小bug:你把dtype和parse_dates参数写到pd.read_excel的括号外面了!这直接导致这些设置根本没生效,这也是你的配置不起作用的核心原因之一。不过就算修正了这个,有时候dtype参数对这类"疑似科学计数法"的内容还是不太靠谱,咱们用更稳妥的方案来处理:
最靠谱的解决方案:用converters参数强制转字符串
converters参数是在读取每个单元格的第一时间就把内容转成字符串,跳过pandas的自动类型推断,从根源上避免科学计数法的转换。给你修正后的完整代码:
import pandas as pd # 文件路径 2025_data = '/content/drive/MyDrive/Data Cleaning/2025-10 Data Checking/2025_data.xlsx' # 读取所有sheet,重点用converters指定列类型 df_25_dict = pd.read_excel( 2025_data, sheet_name=None, converters={ 'bg_code': str, 'tranx_date_year': str, 'journal_number': str, 'journal_line_number': str, 'prj_code': str }, parse_dates=['tranx_date', 'entry_date'] ) # 遍历sheet查看信息,顺便验证bg_code的类型 for sheet_name, df in df_25_dict.items(): print(f"Sheet: {sheet_name}") print(df.shape) print(df.columns) # 加两行验证代码,确认bg_code的类型和原始内容 print(f"bg_code列数据类型: {df['bg_code'].dtype}") print(f"bg_code示例值: {df['bg_code'].head().tolist()}")
原理说明
dtype参数是pandas先把单元格内容解析成它认为的类型(比如把2004E205当成科学计数法转成浮点数),再转成字符串——这时候已经晚了,转出来的是长数字字符串。而converters是在解析前直接把单元格内容转成字符串,完美保留原始的2004E205格式。
双重保险:先把Excel列设置为文本格式
如果上面的方法还是偶尔出问题,那大概率是Excel本身搞的鬼:如果bg_code列在Excel里是"数字"格式,就算你输入的是2004E205,Excel会偷偷把它转成科学计数法存储。这时候你需要:
- 打开Excel文件,选中
bg_code整列 - 右键选择「设置单元格格式」,在弹出窗口里选「文本」
- 保存文件后再用上面的代码读取,就能彻底杜绝这个问题
最后再唠叨一句
如果你用的是.xlsx格式的文件,确保pandas默认用的是openpyxl引擎(现在pandas对xlsx默认就是这个);如果是老的.xls格式,用xlrd引擎就行——不管哪种,converters参数都能稳定生效。按这个方法来,你的bg_code肯定能原封不动读成字符串!




