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

Pandas与openpyxl读写xlsx时如何保留Hours列hh:mm:ss自定义格式

问题根因
  • pandas 没有原生的纯时间类型,执行 pd.to_datetime(...).dt.time 操作后,列中存储的是Python原生time对象,对应dtype必然为object,这不是转换失效,是pandas的类型设计限制
  • to_excel 方法搭配openpyxl引擎时,不会自动为单元格匹配自定义格式,写入的单元格默认套用常规格式
  • 代码中通过date_format='yyyy-mm-dd'传入的格式参数,仅对完整的日期时间列生效,对时分秒格式的时间列无作用
  • 原有加载源工作簿、删表重建工作表的逻辑,没有给重建的工作表保留预定义的单元格格式规则
可落地的解决实现

核心思路:写入数据完成后,显式给Hours列的所有数据单元格指定hh:mm:ss的数字格式,即可完全复现源文件的显示效果,同时简化不必要的工作簿重建流程。
完整可运行代码:

import pandas as pd
from openpyxl import load_workbook

path = r'D:\Test\Test.xlsx'
path2 = r'D:\Test\TestResult.xlsx'

# 读入源数据
df = pd.read_excel(path, sheet_name=0, index_col=None, na_values=['NA'])
# 保留Hours列为datetime类型,不强制转dt.time,后续时长计算、时间运算更方便
df['Hours'] = pd.to_datetime(df['Hours'], format='%H:%M:%S')

# 加载源工作簿,保留原有样式基础
book = load_workbook(path)
first_sheet_name = book.sheetnames[0]
ws = book[first_sheet_name]
# 清空原有表内容,无需删除表重建
ws.delete_rows(1, ws.max_row)

writer = pd.ExcelWriter(path2, engine='openpyxl')
writer.book = book
writer.sheets = {ws.title: ws for ws in book.worksheets}

# 写入处理后的数据
df.to_excel(writer, sheet_name=first_sheet_name, index=False)

# 定位Hours列的Excel列索引(Excel列号从1开始计数)
hours_col_loc = df.columns.get_loc('Hours') + 1
# 批量给该列数据单元格设置hh:mm:ss格式(跳过表头)
for row_num in range(2, ws.max_row + 1):
    target_cell = ws.cell(row=row_num, column=hours_col_loc)
    target_cell.number_format = 'hh:mm:ss'

writer.save()
补充说明
  • 如果业务逻辑中确实需要将Hours列转为纯time对象处理,也不影响格式生效:只要在写入完成后给对应单元格设置数字格式,openpyxl即可正确渲染时间值,不会出现内容错位
  • 无需保留源文件结构的场景下,可进一步简化流程:直接新建空白工作簿写入数据,写完统一给目标列设置格式即可,省去加载源文件的IO开销
  • 不要依赖pandas自动匹配源文件格式的能力,自定义单元格格式必须通过openpyxl的number_format属性显式指定,才能保证输出和源文件效果一致

内容的提问来源于stack exchange,提问作者JerryC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 19:24:01