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

Python比较datetime对象时报str与datetime类型不兼容错误如何解决

问题原因分析

  • 表头被纳入计算:你读取的A列第一行是表头Date,本身就是字符串类型,没有被跳过直接参与了日期对比,自然会触发类型不匹配的错误。你之前校验类型时大概率只检查了数据行,忽略了第一行的表头值。
  • 单元格格式不统一:Excel中部分日期单元格如果设置为文本格式,openpyxl读取时不会自动转换为datetime对象,会直接返回对应格式的字符串。
  • 循环逻辑存在漏洞:你循环从x=0开始迭代,第一次执行时x-1 = -1,会读取A列最后一个单元格的值,逻辑本身就不符合业务要求,也可能触发不同类型的值对比。

解决方法

核心思路

先跳过表头,再统一对所有读取到的日期值做类型转换,保证对比的两个值都是datetime类型;删除不符合要求的行时采用倒序遍历,避免正序删除导致行号偏移漏检。

可直接运行的代码

from openpyxl import load_workbook
from datetime import datetime

# 替换为你的文件路径
Input_file = "测试文件.xlsx"
wb = load_workbook(Input_file)
sheet = wb.active

# 统一日期转换函数,兼容字符串和datetime两种输入
def to_date(val):
    if isinstance(val, datetime):
        return val
    # 按你的日期格式「日-月-年」解析,如果实际格式不同可调整格式符
    return datetime.strptime(val.strip(), "%d-%m-%Y")

# 倒序遍历:从最后一行数据开始,到第二行(Excel行号2,第一行是表头)结束
max_row = sheet.max_row
for x in range(max_row, 2, -1):
    # 取当前行、上一行的日期值(column=1对应A列)
    date_now = to_date(sheet.cell(row=x, column=1).value)
    date_prev = to_date(sheet.cell(row=x-1, column=1).value)
    # 不满足晚于上一行的要求就删除当前行
    if date_now <= date_prev:
        sheet.delete_rows(x)

# 保存清洗后的文件
wb.save("清洗后文件.xlsx")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:57:03