计算基辅各季节平均气温出现负值的技术问题求助
问题排查:基辅季节平均气温计算全为负值
我编写Python代码计算乌克兰基辅市各季节平均气温时,所有结果均为负值,明显不符合实际情况。已确认华氏温度转摄氏温度的转换函数无问题,以下是代码实现、转换函数及样本数据,恳请帮忙排查原因:
核心代码
# 筛选基辅的气温数据 kiev_df = df[df["City"] == "Kiev"].copy() # 华氏温度转摄氏温度 kiev_df = fahr_to_celsius(kiev_df) # 将"dt"列转换为日期格式 kiev_df.loc[:, "dt"] = pd.to_datetime(kiev_df["dt"], format="%Y%m%d") def get_season(month): """ 将月份映射到对应季节 参数: month (int): 月份数字(1代表1月,2代表2月等) 返回: str: 输入月份对应的季节 """ if month in [12, 1, 2]: return "Winter" elif month in [3, 4, 5]: return "Spring" elif month in [6, 7, 8]: return "Summer" else: return "Autumn" # 为每条数据添加季节标签 kiev_df.loc[:, "Season"] = kiev_df["dt"].dt.month.map(get_season) # 按年份和季节分组,计算气温均值 seasonal_avg = kiev_df.groupby([kiev_df["dt"].dt.year, "Season"]).agg({ "AverageTemperature": "mean" , "Tuncertainty": "mean" }).reset_index() seasonal_avg.columns = ["Year", "Season", "AvgTemperature", "AvgUncertainty"] print(seasonal_avg)
温度转换函数
def fahr_to_celsius(df): """ 将华氏温度转换为摄氏温度(排除"Tuncertainty"列) 参数: - df (DataFrame): 包含气温数据的DataFrame 返回: - DataFrame: 转换后的DataFrame,气温列已转为摄氏温度 """ # 需要转换的气温列 celsius_conv = ["TMAX", "TMIN", "AverageTemperature"] for col in celsius_conv: df[col] = (df[col] - 32) / 1.8 return df
样本数据
dt AverageTemperature Tuncertainty City Country TMAX TMIN 114929 17440401 49.676 4.4964 Kiev Ukraine 54.1724 45.1796 114930 17440501 55.6556 3.321 Kiev Ukraine 58.9766 52.3346 114931 17440601 63.3074 3.0654 Kiev Ukraine 66.3728 60.242 114932 17440701 66.9002 2.8656 Kiev Ukraine 69.7658 64.0346 114933 17440801 -9999 2.9466 Kiev Ukraine 68.28430418 63.60738403
问题原因
样本数据中存在-9999这个无效值标记(通常代表缺失数据),该值经过华氏转摄氏计算后为(-9999-32)/1.8 ≈ -5572.78℃,这个极端异常值会大幅拉低分组后的平均气温,最终导致所有季节的计算均值都呈现负值。
解决方案
在计算均值前,先处理这些无效数据,以下两种方法任选其一:
- 直接删除无效值行
在温度转换步骤后添加过滤代码:
# 过滤掉AverageTemperature为-9999的无效数据行 kiev_df = kiev_df[kiev_df["AverageTemperature"] != -9999]
- 将无效值替换为NaN,计算时自动忽略
# 将-9999替换为pandas可识别的缺失值标记 kiev_df["AverageTemperature"] = kiev_df["AverageTemperature"].replace(-9999, pd.NA) # 分组计算均值时,pandas默认会自动忽略NaN值,也可显式指定skipna=True seasonal_avg = kiev_df.groupby([kiev_df["dt"].dt.year, "Season"]).agg({ "AverageTemperature": lambda x: x.mean(skipna=True), "Tuncertainty": "mean" }).reset_index()
执行上述操作后,再计算季节平均气温即可得到符合实际的结果。
内容的提问来源于stack exchange,提问作者Blackrabbit2
相关产品推荐
相关产品推荐

