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

