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
相关产品推荐
相关产品推荐

