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

计算基辅各季节平均气温出现负值的技术问题求助

问题排查:基辅季节平均气温计算全为负值

我编写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℃,这个极端异常值会大幅拉低分组后的平均气温,最终导致所有季节的计算均值都呈现负值。

解决方案

在计算均值前,先处理这些无效数据,以下两种方法任选其一:

  1. 直接删除无效值行
    在温度转换步骤后添加过滤代码:
# 过滤掉AverageTemperature为-9999的无效数据行
kiev_df = kiev_df[kiev_df["AverageTemperature"] != -9999]
  1. 将无效值替换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:24:52