Pandas读取.xlsx列时误将浮点值识别为Datetime的解决方法
解决Pandas读取Excel时将数值列识别为datetime的问题
针对你遇到的Excel列因格式问题被Pandas误识别为datetime类型的情况,以下是几种无需修改源文件的解决方法,适配你的Pandas 1.4.4、Python 3.8及依赖版本:
方法1:使用converters参数强制转换列类型
通过自定义转换函数,将被识别为datetime的值转换回Excel对应的浮点数值,同时兼容正常的浮点值:
import pandas as pd from datetime import datetime def convert_to_float(val): # 处理被识别为datetime的情况 if isinstance(val, datetime): # Excel日期以1899-12-30为基准(兼容Excel的闰年bug),计算对应的浮点值 excel_epoch = datetime(1899, 12, 30) time_delta = val - excel_epoch return time_delta.total_seconds() / (24 * 3600) # 处理原本就是数值/字符串的情况 try: return float(val) except (ValueError, TypeError): return pd.NA # 无法转换的返回空值 # 读取Excel时指定转换器 df = pd.read_excel("your_file.xlsx", converters={"USDC Amount USDC": convert_to_float})
方法2:用openpyxl直接读取原始数值
绕过Pandas的自动类型推断,直接通过openpyxl读取单元格的原始值,再替换到DataFrame中:
from openpyxl import load_workbook import pandas as pd # 加载Excel文件,data_only=True获取单元格的实际值(忽略格式) wb = load_workbook("your_file.xlsx", data_only=True) ws = wb.active # 获取表头,定位目标列的索引(openpyxl列是1-based) headers = [cell.value for cell in ws[1]] target_col = headers.index("USDC Amount USDC") + 1 # 提取目标列的所有数据(从第2行开始) target_data = [] for row in ws.iter_rows(min_row=2, min_col=target_col, max_col=target_col, values_only=True): target_data.append(row[0]) # 读取整个Excel,然后替换目标列 df = pd.read_excel("your_file.xlsx") df["USDC Amount USDC"] = pd.Series(target_data).astype(float)
方法3:指定engine并调整读取参数
如果你的Excel是.xls格式,可尝试使用xlrd引擎读取;对于.xlsx格式,优先使用openpyxl引擎配合data_only=True的方式,能更可靠地忽略格式影响。
注意事项
- 确保目标列的实际值都是可转换为float的数值,若存在非数值内容,需在转换函数中做额外处理。
data_only=True仅读取单元格的计算结果,若目标列包含公式,需确保公式已计算完成。
内容的提问来源于stack exchange,提问作者EllipticalInitial
相关产品推荐
相关产品推荐

