如何计算嵌套字典中所有未被masked的云底高度值的平均值?
如何计算嵌套字典中所有未被masked的云底高度值的平均值?
嘿,我来帮你搞定这个问题!你之前的尝试踩了两个关键小坑,咱们先理清楚问题,再一步步解决:
你之前出错的原因
- 变量引用错误:第一个尝试里循环
date in obs时直接用了obs_day,但这个变量是你之前读取文件时的局部变量,到这一步已经变成字符串类型了,自然会报'str' object has no attribute 'values'的错误。 - masked值判断逻辑错误:你用
v != "masked"来过滤无效值,但实际上你的masked是numpy的np.ma.masked对象,不是字符串,这种判断完全不会生效,导致过滤后可能没有有效数据,触发mean requires at least one data point的错误。
正确解决方案:计算整个月的平均云高
我们需要先遍历整个嵌套字典,把所有未被masked的云高值收集到一个列表里,再计算平均值,这样既避免了按天计算可能出现的无数据情况,也能直接得到整个月的平均:
import numpy as np # 初始化空列表,存储所有有效的云底高度 all_valid_heights = [] # 遍历外层字典的每个日期和对应的小时数据 for date, hourly_data in obs.items(): # 遍历当天每个小时的云高值 for height in hourly_data.values(): # 用numpy专用方法判断是否未被masked if not np.ma.is_masked(height): all_valid_heights.append(height) # 计算并输出结果,先判断列表不为空避免报错 if all_valid_heights: monthly_average = np.mean(all_valid_heights) print(f"2019年10月的平均云底高度为:{monthly_average}") else: print("没有找到任何有效的云底高度数据")
额外需求:按天计算每天的平均云高
如果你还需要单独统计每天的平均云高(忽略当天的masked值),可以用下面的代码:
import numpy as np daily_averages = {} for date, hourly_data in obs.items(): # 收集当天所有未被masked的数值 daily_valid = [h for h in hourly_data.values() if not np.ma.is_masked(h)] if daily_valid: daily_averages[date] = np.mean(daily_valid) else: # 如果当天全是masked,标记为masked或者自定义提示 daily_averages[date] = np.ma.masked # 输出每天的结果 for date, avg in daily_averages.items(): print(f"日期 {date} 的平均云底高度:{avg}")
备注:内容来源于stack exchange,提问作者lkdedrick
相关产品推荐
相关产品推荐

