Python天气数据处理代码故障排查:numdays计数未递增导致Divide by Zero错误
问题定位与修复方案
嘿,我一眼就瞅出你代码里的核心问题了——你在处理输入月份和年份后的逻辑完全走偏,这直接导致numdays计数器纹丝不动,最终触发除以零的崩溃。
为啥numdays不递增?
咱们来拆解下你这段错误的代码:
munshort = month[0:3] for I in range(len(munshort)): if munshort[I][0] == date : numdays += 1
munshort = month[0:3]只是把你输入的月份(比如"October")截取成前3个字符("Oct"),这就是个普通字符串,根本不是你之前辛辛苦苦分好的月度数据列表(Jan、Feb那些)。- 然后你循环
range(len(munshort))——最多循环3次,每次拿munshort[I][0],这其实是取字符串里每个字符的第一个字符(还是它自己),再和整数类型的date比较。字符串和整数永远不可能相等啊!所以这个判断条件从来没成立过,numdays自然一直是0。
怎么修复?
咱们得把输入的月份和你之前分好的月度数据列表关联起来,然后正确筛选出对应年份的记录:
第一步:建立月份到数据列表的映射
先搞个字典,把各种月份输入(全称、缩写)和对应的列表绑定,这样不管用户输入"October"还是"Oct",都能找到对应的Oct列表:
# 放在分完月份的代码后面 month_data_map = { "january": Jan, "jan": Jan, "february": Feb, "feb": Feb, "march": Mar, "mar": Mar, "april": Apr, "apr": Apr, "may": May, "june": Jun, "jun": Jun, "july": Jul, "jul": Jul, "august": Aug, "aug": Aug, "september": Sep, "sep": Sep, "sept": Sep, "october": Oct, "oct": Oct, "november": Nov, "nov": Nov, "december": Dec, "dec": Dec }
第二步:重写统计逻辑
替换掉你原来错误的循环,改成下面这样:
# 处理用户输入时转成小写,兼容各种大小写输入 month = input("Please enter a month:").strip().lower() # 把年份转成字符串,因为CSV里的日期是字符串格式(比如"10/5/2021") date = str(input("Please enter a year:")) numdays = 0 meantemp = 0.0 percentdaygood = 0.0 percentdaybad = 0.0 meanprecip = 0.0 # 先拿到对应月份的数据列表,如果输入的月份无效就提示退出 target_month_data = month_data_map.get(month) if not target_month_data: print("Oops, that's not a valid month!") exit() print(f"for {month.title()} {date}:") # 遍历对应月份的每一行数据 for row in target_month_data: # 从日期字段里提取年份(假设你的日期格式是"MM/DD/YYYY",最后四位是年份) row_year = row[0][-4:] if row_year == date: numdays += 1 # 累加温度(对应你代码里的brok[I][3]) meantemp += int(row[3]) # 统计好坏天数(对应你代码里的brok[I][1]) if int(row[1]) >= 10: percentdaygood += 1 else: percentdaybad += 1 # 累加降水量(对应你代码里的brok[I][2]) meanprecip += float(row[2]) # 先判断有没有找到数据,避免除以零 if numdays == 0: print(f"Sorry, no data found for {month.title()} {date}") else: avgtemp = meantemp / numdays # 这里修正了原逻辑的错误:好天数占比应该除以总天数,而非坏天数 percentotal = (percentdaygood / numdays) * 100 avgprecip = meanprecip / numdays print("\nMean daily temperature:", "{:.2f}".format(avgtemp)) print(f"Percentage of good days: {percentotal:.2f}%") print(f"Average precipitation: {avgprecip:.3f}")
额外的优化小技巧
- 简化分月份的逻辑:你原来用了12个if判断分月份,可以改成更简洁的方式:
# 替换原来的分月份循环 for row in brok[1:]: # 跳过表头行 date_str = row[0] # 从日期里提取月份数字 month_num = date_str.split("/")[0] # 用字典映射到对应的列表 month_list = { "1": Jan, "2": Feb, "3": Mar, "4": Apr, "5": May, "6": Jun, "7": Jul, "8": Aug, "9": Sep, "10": Oct, "11": Nov, "12": Dec }[month_num] month_list.append(row) - 用csv模块处理CSV文件:手动
split(",")容易出错(比如字段里有逗号的情况),用内置的csv模块更可靠:import csv brok = [] with open('CLLWeatherData.csv', 'r') as inputFile: reader = csv.reader(inputFile) brok = list(reader)
最后总结
你的核心问题就是把月份字符串当成了数据列表来遍历,导致年份匹配的逻辑完全失效,numdays根本没法递增。通过建立月份到数据列表的映射,正确遍历对应月份的记录并筛选年份,再加上边界判断(比如无效输入、无数据的情况),就能彻底解决这个问题啦!
内容的提问来源于stack exchange,提问作者Lethal_turnip
相关产品推荐
相关产品推荐

