Python读取XLSX文件时如何保留原始日期格式?
问题需求
需要读取.xlsx格式Excel文件中的日期列,保留与Excel显示完全一致的%d/%m/%Y格式字符串,禁止使用strftime修改格式,后续需导出回Excel并验证原始格式。原始列数据如下:
Date Of Birth 09/01/1990 18/02/1976 08/04/1983 10/02/1973 03/03/1987 02/11/1977 25/05/1992
已尝试的无效方法
尝试1:指定dtype为字符串
import pandas as pd df=pd.read_excel('file.xlsx',sheet_name='sheet', dtype= {'Date_Of_Birth': str})
结果自动追加了时间后缀,不符合要求:
Date Of Birth 09/01/1990 00:00:00 18/02/1976 00:00:00 08/04/1983 00:00:00 10/02/1973 00:00:00 03/03/1987 00:00:00 02/11/1977 00:00:00 25/05/1992 00:00:00
尝试2:结合parse_dates与dtype参数
import pandas as pd df_ = pd.read_excel('file.xlsx',sheet_name='sheet', parse_dates=['Date_Of_Birth'], dtype={'Date_Of_Birth': object})
结果被转换为ISO标准日期格式,丢失原始显示格式:
Date Of Birth 1990-01-09 1976-02-18 1983-04-08 1973-02-10 1987-03-03
可行解决方案
核心原因
Excel中的日期本质是浮点数值,dd/mm/yyyy是单元格的格式设置。pandas默认读取的是底层数值并转换为datetime对象,因此无法直接获取显示格式的字符串。必须直接读取单元格的显示文本。
方案1:使用openpyxl直接读取显示文本
这是最直接的方式,直接提取Excel单元格显示的字符串:
from openpyxl import load_workbook import pandas as pd # 加载工作簿和工作表 wb = load_workbook('file.xlsx') ws = wb['sheet'] # 提取日期列数据(跳过表头行) date_data = [] # 遍历第2行及以后的行,读取第一列(假设日期列是第一列) for row in ws.iter_rows(min_row=2, max_col=1, values_only=False): date_cell = row[0] date_data.append(date_cell.text) # 转换为DataFrame(如需pandas处理) df = pd.DataFrame({'Date Of Birth': date_data})
执行后得到的Date Of Birth列完全匹配Excel的显示格式,无额外后缀或格式转换。
方案2:pandas配合openpyxl引擎自定义转换
如果需要保留pandas的读取流程,可通过converters参数自定义读取逻辑:
import pandas as pd from openpyxl import load_workbook wb = load_workbook('file.xlsx') ws = wb['sheet'] # 定位日期列的索引(根据表头匹配) date_col_idx = None for col_num, cell in enumerate(ws[1], 1): if cell.value == 'Date Of Birth': date_col_idx = col_num break # 自定义转换器:读取对应单元格的显示文本 def read_display_text(row_num): return ws.cell(row=row_num, column=date_col_idx).text # 读取Excel,指定转换器 df = pd.read_excel('file.xlsx', sheet_name='sheet', engine='openpyxl', converters={date_col_idx: lambda x: read_display_text(ws._current_row)})
内容的提问来源于stack exchange,提问作者Ashish Khatana
相关产品推荐
相关产品推荐

