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

解决Pandas样式设置时int与Timestamp无法比较的TypeError问题

问题解决:有效期不足6个月时标记产品名称的错误修复

错误原因分析

  1. 类型转换未生效:执行pd.DatetimeIndex(epi2['Validade'])后未将结果赋值回原DataFrame,导致Validade列可能仍为非datetime类型,存在潜在类型冲突。
  2. 样式函数逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:01:38