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

新手求助:openpyxl转换Excel字符串列为datetime失败,无法日期对比

问题解决思路

核心原因分析

你遇到的报错time data 'Data_scadenza' does not match format...,大概率是遍历Excel数据时把表头行(列名)当成了数据行处理,导致尝试将列名Data_scadenza这个字符串转换成datetime,自然匹配失败。另外,Excel里显示的aaaa-mm-gg是意大利语日期格式(aaaa=年,mm=月,gg=日),对应Python的%Y-%m-%d格式。

具体解决步骤

1. 修正openpyxl遍历逻辑,跳过表头

openpyxl的行号从1开始,第一行是表头,必须从第2行开始遍历数据:

from openpyxl import load_workbook
from openpyxl.styles import PatternFill
from datetime import datetime

# 加载Excel文件
wb = load_workbook('你的文件名.xlsx')
ws = wb.active

# 定义标色样式(红色填充)
red_fill = PatternFill(start_color="FFFF0000", end_color="FFFF0000", fill_type="solid")
today = datetime.today().date()

# 从第2行开始遍历数据行
for row in ws.iter_rows(min_row=2):
    # 假设Data_scadenza是第3列(根据你的实际列位置调整索引,从0开始)
    scadenza_cell = row[2]
    cell_value = scadenza_cell.value

    if cell_value is None:
        continue  # 跳过空单元格

    # 处理数据:如果是字符串则转换,否则直接用datetime对象
    if isinstance(cell_value, str):
        # 尝试带时间的格式,不行就试试不带秒的格式
        try:
            scadenza_date = datetime.strptime(cell_value, '%Y-%m-%d %H:%M:%S')
        except ValueError:
            scadenza_date = datetime.strptime(cell_value, '%Y-%m-%d %H:%M')
    else:
        # openpyxl读取Excel标准日期格式时,会直接返回datetime对象
        scadenza_date = cell_value

    # 对比日期并标色
    if scadenza_date.date() < today:
        scadenza_cell.fill = red_fill

# 保存修改后的文件
wb.save('处理后的文件名.xlsx')

2. 优化pandas导出逻辑,避免日期转字符串

用pandas导出时,指定date_format参数,确保Excel里的列是标准日期时间格式,openpyxl读取时直接识别为datetime对象:

import pandas as pd

# 假设你的DataFrame已处理好,Data_scadenza是datetime类型
df.to_excel('导出的文件名.xlsx', index=False, date_format='%Y-%m-%d %H:%M:%S')

3. 排查特殊格式问题

如果还是转换失败,检查Excel单元格的实际内容:

  • 是否有多余空格、特殊字符?可以用cell_value.strip()去除空格后再转换
  • 日期格式是否不一致?比如部分行是2024-05-20(无时间),这时候需要增加异常处理适配多种格式

内容的提问来源于stack exchange,提问作者Chiara JJ Airon-e Tirendi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:14:56