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

使用for循环和嵌套if处理Pandas数据时节日类型输出异常如何解决

问题根因与解决方案

核心问题1:类型不匹配导致条件判断全部失效

你调用了strftime('%d-%b-%y')把date_of_true转换为了字符串格式(比如输出的12-Feb-10就是字符串),但判断条件里的比较对象是datetime.datetime类型的对象,两种完全不同类型的值做相等判断永远返回False,所以你写的所有if/elif分支都不会触发,return_holiday只会保留最后一次成功赋值的结果,这就是为什么前面所有行都输出了和最后一行一样的值。

核心问题2:判断用的节日日期和实际数据日期不匹配

比如你数据里2012年的劳工节对应日期是2012-09-07,但你代码里写的判断值是2012-09-12,就算类型匹配也无法正常匹配到对应节日。

修正后代码

更易维护的写法(推荐)

提前整理节日日期映射表,判断逻辑更清晰,不容易写错日期:

import datetime

holiday_map = {
    "Superbowl": [
        datetime.datetime(2010, 2, 12),
        datetime.datetime(2011, 2, 11),
        datetime.datetime(2012, 2, 10),
        datetime.datetime(2013, 2, 18)
    ],
    "Labour Day": [
        datetime.datetime(2010, 9, 10),
        datetime.datetime(2011, 9, 9),
        datetime.datetime(2012, 9, 7),
        datetime.datetime(2013, 9, 13)
    ],
    "Thanksgiving": [
        datetime.datetime(2010, 11, 26),
        datetime.datetime(2011, 11, 25),
        datetime.datetime(2012, 11, 23),
        datetime.datetime(2013, 11, 29)
    ],
    "Christmas": [
        datetime.datetime(2010, 12, 31),
        datetime.datetime(2011, 12, 30),
        datetime.datetime(2012, 12, 28),
        datetime.datetime(2013, 12, 27)
    ]
}

for i in range(len(holiday_sales_4)):
    if holiday_sales_4.iloc[i]['Weekly_Sales']:
        current_date = holiday_sales_4.iloc[i]['Date']
        for holiday_name, date_list in holiday_map.items():
            if current_date in date_list:
                return_holiday = holiday_name
                break
        print(current_date.strftime('%d-%b-%y'), '-', return_holiday)

基于你原有代码的最小修改版

不需要改整体逻辑,只修正类型和错误日期即可:

for i in range(0, len(holiday_sales_4)):
    comparison=holiday_sales_4.iloc[i]['Weekly_Sales']
    if comparison == True:
        # 去掉strftime,保留datetime类型用于判断
        date_of_true=holiday_sales_4.iloc[i]['Date']
        if (date_of_true==datetime.datetime(2010, 2, 12) or 
            date_of_true==datetime.datetime(2011, 2, 11) or 
            date_of_true==datetime.datetime(2012, 2, 10) or 
            date_of_true==datetime.datetime(2013, 2, 18)):
            return_holiday="Superbowl"
        # 修正2011、2012年劳工节的日期为数据实际值
        elif (date_of_true==datetime.datetime(2010, 9, 10) or 
              date_of_true==datetime.datetime(2011, 9, 9) or 
              date_of_true==datetime.datetime(2012, 9, 7) or 
              date_of_true==datetime.datetime(2013, 9, 13)):
            return_holiday="Labour Day"
        elif (date_of_true==datetime.datetime(2010, 11, 26) or 
              date_of_true==datetime.datetime(2011, 11, 25) or 
              date_of_true==datetime.datetime(2012, 11, 23) or 
              date_of_true==datetime.datetime(2013, 11, 29)):
            return_holiday="Thanksgiving"
        elif (date_of_true==datetime.datetime(2010, 12, 31) or 
              date_of_true==datetime.datetime(2011, 12, 30) or 
              date_of_true==datetime.datetime(2012, 12, 28) or 
              date_of_true==datetime.datetime(2013, 12, 27)):
            return_holiday="Christmas"
        # 输出的时候再转成要求的字符串格式
        print(date_of_true.strftime('%d-%b-%y'),'-', return_holiday)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 05:54:03