如何使用pandas计算CSV文件中每日对应的过去两周平均气温
实现步骤及代码
核心逻辑:因为你有多个气象站点的数据,必须按站点分组后单独计算每个站点的滑动平均,不能跨站点混合计算,同时要先处理异常值和日期格式,保证时间顺序正确。
步骤1:导入依赖并预处理数据
首先处理Tavg列的'M'缺失标记,转成数值类型,同时把日期列转成pandas可识别的日期格式,按站点+日期升序排序,保证滑动窗口的时间顺序正确。
import pandas as pd # 读取CSV文件 df = pd.read_csv('你的气温文件路径.csv') # 处理Tavg列的'M'缺失值,转成浮点型,无法转换的异常值存为NaN df['Tavg'] = pd.to_numeric(df['Tavg'], errors='coerce') # 转换日期列为datetime类型 df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y') # 按站点、日期升序排序,保证时间序列顺序正确 df = df.sort_values(by=['Station', 'Date'], ignore_index=True)
步骤2:分组计算14天滑动平均
对每个站点单独开滑动窗口,窗口大小设为14天,计算Tavg的均值,结果存为新列Tavg_14d_rolling。可根据需求调整参数:
window=14:窗口大小为14天,对应过去两周min_periods=1:如果窗口内有效数据不足14天(比如序列最开头的几天),有多少条就用多少条计算均值;不需要保留不足14天的结果可以删除这个参数,默认和window大小一致,不足的位置返回NaNclosed='right':包含窗口的右端点也就是当日,符合“截至当日的过去两周”的统计逻辑
# 按站点分组后计算滑动平均 df['Tavg_14d_rolling'] = df.groupby('Station')['Tavg'].rolling( window=14, min_periods=1, closed='right' ).mean().reset_index(drop=True)
可选优化:按时间间隔做窗口(更准确)
如果你的数据存在日期缺失(比如某站点某天没有上报数据),用行数计算的窗口会不准,这时可以把日期设为索引,用时间间隔做窗口,哪怕中间缺数据也会严格统计过去14天内的所有有效数据:
# 把日期设为索引 df = df.set_index('Date') # 用14天时间间隔做窗口 df['Tavg_14d_rolling'] = df.groupby('Station')['Tavg'].rolling( window='14D', min_periods=1, closed='right' ).mean().reset_index(drop=True) # 恢复原结构,把日期从索引转回列 df = df.reset_index()
处理完成后如果需要保存结果,调用df.to_csv('处理后的气温文件.csv', index=False)即可。
内容的提问来源于stack exchange,提问作者Pythonista0801
相关产品推荐
相关产品推荐

