解决Pandas样式设置时int与Timestamp无法比较的TypeError问题
问题解决:有效期不足6个月时标记产品名称的错误修复
错误原因分析
- 类型转换未生效:执行
pd.DatetimeIndex(epi2['Validade'])后未将结果赋值回原DataFrame,导致Validade列可能仍为非datetime类型,存在潜在类型冲突。 - 样式函数逻辑错误:
add_color函数中用Validade列的单个时间戳值(x)与整个ate_vencer数值列比较,既存在类型不兼容(时间戳 vs 整数/浮点数),也完全偏离了“判断有效期剩余不足6个月”的需求逻辑。
修复后的代码
import pandas as pd import numpy as np # 读取数据并过滤空值 epi1 = pd.read_excel('/content/timadatepandasepi.xlsx') epi2 = epi1.dropna(subset=['Validade']) # 显式转换有效期列为datetime类型(关键:必须赋值回原列) epi2['Validade'] = pd.to_datetime(epi2['Validade']) # 获取当前日期(标准化到日,去除时分秒) today = pd.to_datetime('today').normalize() # 计算每条记录距离过期的剩余月份数 epi2['ate_vencer'] = (epi2['Validade'] - today) / np.timedelta64(1, 'M') # 定义样式函数:针对产品名称列(替换为你实际的产品名称列名,比如'Nome') def highlight_expiring_products(row): # 初始化空样式列表 styles = [''] * len(row) # 获取产品名称列的索引位置 name_col_idx = row.index.get_loc('Nome') # 判断剩余有效期是否在0到6个月之间 if 0 < row['ate_vencer'] < 6: styles[name_col_idx] = 'background-color: red' return styles # 应用样式到DataFrame(按行处理) styled_epi = epi2.style.apply(highlight_expiring_products, axis=1) # 显示带样式的结果 styled_epi
关键修正点
- 强制类型转换:将
Validade列显式转换为datetime类型并赋值,确保后续日期计算和比较的类型一致性。 - 修正样式逻辑:通过按行处理的
apply方法,获取每条记录的剩余有效期数值,判断是否符合条件后,给对应产品名称列添加红色背景。 - 明确列定位:通过
row.index.get_loc精准定位产品名称列,避免样式应用错误。
内容的提问来源于stack exchange,提问作者lucas lima
相关产品推荐
相关产品推荐

