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

热指数计算项目:修正0值替换为前后值均值的代码问题

热指数计算项目:0值替换逻辑修正

问题场景

在热指数计算项目中,需要从Temperature365.txt和Humidity365.txt读取温湿度数据。当数值为0时,要求用前一个有效数值和后一个有效数值的均值替换(如序列34、21、0、42中的0需替换为(21+42)/2),但当前代码错误地用前两个值的均值计算。

错误原因

  • handle_missing_values函数逻辑缺陷:当前代码直接取相邻位置的数值,若相邻位置也是0,无法找到真正的前/后有效数值;同时原代码逐行处理数据时,无法获取还未读取的后续数值,导致无法找到后一个有效数值。
  • 文件遍历中的错误处理:原代码针对第12行(索引11)的处理逻辑完全错误——遍历到该行时,后续数据还未读取,Hlist[i+1]根本不存在;且两个if Hx == 0的条件重复,第二个分支永远不会执行。

修正后的完整代码

c1 = -8.78469475556
c2 = 1.61139411
c3 = 2.33854883889
c4 = -0.14611605
c5 = -0.012308094
c6 = -0.0164248277778
c7 = 2.211732 * 10**-3
c8 = 7.2546 * 10**-4
c9 = -3.582 * 10**-6

def whatstatus(hi_val):
    if hi_val >= 54:
        return "Extreme Danger"
    elif 41 <= hi_val < 54:
        return "Danger"
    elif 32 <= hi_val < 41:
        return "Extreme Caution"
    elif 27 <= hi_val < 32:
        return "Caution"
    else:
        return "Normal"

def cal_hi(T, H):
    Hi = c1 + (c2 * T) + (c3 * H) + (c4 * T * H) + (c5 * (T**2)) + (c6 * (H**2)) + (c7 * (T**2) * H) + (c8 * T * (H**2)) + (c9 * (T**2) * (H**2))
    return Hi

def find_previous_valid(data_list, index):
    """找到当前索引前第一个非0的有效数值"""
    for i in range(index-1, -1, -1):
        if data_list[i] != 0:
            return data_list[i]
    return None

def find_next_valid(data_list, index):
    """找到当前索引后第一个非0的有效数值"""
    for i in range(index+1, len(data_list)):
        if data_list[i] != 0:
            return data_list[i]
    return None

def handle_missing_values(data_list):
    """用前后第一个有效数值的均值替换0值,若仅单侧有有效值则用单侧值,无有效值则保留0"""
    output_list = data_list.copy()
    for i in range(len(output_list)):
        if output_list[i] == 0:
            prev_val = find_previous_valid(output_list, i)
            next_val = find_next_valid(output_list, i)
            
            if prev_val is not None and next_val is not None:
                output_list[i] = (prev_val + next_val) / 2
            elif prev_val is not None:
                output_list[i] = prev_val
            elif next_val is not None:
                output_list[i] = next_val
            # 两者都为空则保留0
    return output_list

# 先读取所有数据到列表,再处理缺失值
with open('Humidity365.txt') as Hf, open('Temperature365.txt') as Tf:
    # 读取全部温湿度数据
    Tlist = [float(line.strip()) for line in Tf]
    Hlist = [float(line.strip()) for line in Hf]

# 处理温湿度中的0值
Tlist_fixed = handle_missing_values(Tlist)
Hlist_fixed = handle_missing_values(Hlist)

# 输出结果
print("Day\tTemperature(C)\tHumidity(%)\tHeat Index\tStatus", "\n", "---" * 22)
for day in range(len(Tlist_fixed)):
    Tx = Tlist_fixed[day]
    Hx = Hlist_fixed[day]
    heat_index_val = cal_hi(Tx, Hx)
    stat = whatstatus(heat_index_val)
    print(f"{day+1}\t{Tx:.2f}\t\t{Hx:.2f}\t\t{heat_index_val:.2f}\t\t{stat}")
    
    if (day+1) % 30 == 0:
        input("Press <ENTER> to continue")

修正说明

  • 先读取全部数据再处理:原代码逐行处理时无法获取后续未读取的数值,改为先将所有温湿度数据读取到列表,再统一处理0值,确保能找到前后有效数值。
  • 新增有效数值查找函数:find_previous_valid和find_next_valid负责跳过连续的0,找到真正的前/后第一个非0数值,解决连续0的场景。
  • 完善缺失值处理逻辑:
    • 若前后都有有效值,取均值替换
    • 仅前侧有有效值,用前侧值替换
    • 仅后侧有有效值,用后侧值替换
    • 无有效值则保留0
  • 删除原代码中错误的逐行处理逻辑:移除了针对第12行的错误判断,改为统一处理所有0值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:54:50