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

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}")

额外的优化小技巧

  1. 简化分月份的逻辑:你原来用了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)
    
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:02:53