新手求助: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
相关产品推荐
相关产品推荐

