You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:33:30