使用pd.read_excel读取Excel时时间信息丢失问题排查
问题分析与解决方案
核心问题
你的date字段丢失小时信息,根源是Excel源文件中该列的单元格格式被识别为日期格式,而非文本/纯数值格式。pd.read_excel读取时会自动将Excel的日期类型转换为仅包含日期部分的datetime对象,哪怕设置dtype=str也没用——因为Excel底层存储的是日期序列化值,不是原始的2010010100字符串。
解决办法
1. 读取时强制保留原始格式(推荐)
用pd.read_excel的converters参数,给date列指定自定义读取函数,确保拿到完整的原始格式字符串:
from datetime import datetime def parse_date_cell(cell): if isinstance(cell, datetime): # 把Excel返回的datetime转回带小时的字符串 return cell.strftime('%Y%m%d%H') # 处理原本就是字符串的情况 return str(cell).strip() # 读取文件时应用转换器 fileread = pd.read_excel(m, engine='openpyxl', converters={'date': parse_date_cell})
读取完成后,date列会保持2010010100格式,后续再用pd.to_datetime(..., format='%Y%m%d%H')转换就能得到包含小时的完整时间戳。
2. 修改源Excel文件的单元格格式
如果你有权限修改原始Excel文件,直接把date列的单元格格式改成文本格式,重新保存后再读取。这种方式最直接,后续读取无需额外处理参数。
3. 补救现有转换逻辑(仅适用于特定场景)
如果无法修改读取方式,且原始数据的小时部分多为00,可以从已丢失小时的日期反推,但通用性差:
# 替换原有的try-except代码块 monthlyo3['date'] = pd.to_datetime( monthlyo3['date'].dt.strftime('%Y%m%d') + '00', format='%Y%m%d%H' )
内容的提问来源于stack exchange,提问作者박정도
相关产品推荐
相关产品推荐

