如何在Pandas中处理批量合并Excel时浮点数被误解析为日期的问题
解决Pandas合并Excel时浮点数列被误解析为日期的问题
问题背景
批量合并Excel文件时,某列被Pandas自动解析为Datetime类型,但该列实际应为浮点数。原因是Excel将使用点作为小数分隔符的数值(如4.5)误识别为日期(显示为2021-04-05这类格式),修改Excel单元格格式为数字会得到无意义的日期序列号,无需逐个修改Excel文件,可直接在Pandas中修复。
合并代码:
path = ["/content/drive/MyDrive/Data REE/XLSX - GENERACIÓN","/content/drive/MyDrive/Data REE/XLSX - EMISIONES"] lista = [1,2] for i in range(2): lista[i] = pd.concat(map(pd.read_excel, glob.glob(path[i] + "/*.xlsx")))
示例DataFrame:
df = pd.DataFrame({'date':['2021-08-01','2021-08-02','2021-08-03','2021-08-04'],'Wind Energy':[0,0,0,0],'Charcoal':[122,125,128,130], 'Gas':['2021-04-05','2021-04-05','2021-04-05','2021-04-05']})
解决方案
方法1:从日期解析回目标浮点数
由于Excel将x.y格式的浮点数误识别为年-x-y的日期(年份为系统默认值),只需提取日期中的月份和日期,组合为x.y格式的浮点数:
# 确保列是datetime类型(若读取时已自动解析可跳过) df['Gas'] = pd.to_datetime(df['Gas']) # 月份作为整数部分,日期作为小数部分,转换为浮点数 df['Gas'] = df['Gas'].dt.month + df['Gas'].dt.day / 10
此方法适用于输入为一位小数的浮点数(如4.5对应日期2021-04-05),处理后直接得到原始浮点数。
方法2:强制读取为字符串后转浮点数
若Excel单元格实际存储的是文本(仅显示格式为日期),读取时指定列类型为字符串,再直接转换为浮点数:
# 自定义读取函数,指定目标列类型为字符串 def read_target_excel(file): return pd.read_excel(file, dtype={'Gas': str}) # 批量读取并合并 for i in range(2): lista[i] = pd.concat(map(read_target_excel, glob.glob(path[i] + "/*.xlsx"))) # 将字符串列转换为浮点数 for df in lista: df['Gas'] = df['Gas'].astype(float)
方法3:处理日期序列号
若Excel中存储的是日期序列号(修改格式为数字时显示的大数),先将序列号转换为日期,再按方法1处理:
# 假设列当前是数值类型(日期序列号) df['Gas'] = pd.to_datetime(df['Gas'], origin='1899-12-30') # Excel的基准日期 df['Gas'] = df['Gas'].dt.month + df['Gas'].dt.day / 10
内容的提问来源于stack exchange,提问作者MatmataHi
相关产品推荐
相关产品推荐

