如何用循环或函数计算十年日均SST的365个日均值?
问题描述
我有一份包含十年每日温度数据的DataFrame,希望计算这十年的日均温度(即每年同一天的温度平均值),最终得到365个数值。目前我通过手动选取行的方式实现了前3天的计算,但想知道如何用循环或更高效的方法完成全部365天的计算。
现有手动实现的代码如下:
import pandas as pd import numpy as np import xarray as xr import hvplot.pandas ds = xr.open_dataset('multiyear_final.nc') ds = ds.rename({'analysed_st':'SST'}) lon=[-52] lat=[69] lon1 = [-20] lat1 = [74] ds1 = ds.SST.sel(lon=lon, lat=lat, method='nearest') ds2 = ds.SST.sel(lon=lon1, lat=lat1, method='nearest') # 手动计算前3天的年均温度 df_time = ds1.to_dataframe() result1 = df_time.iloc[[0,365,730,1095,1460,1826,2191,2556,2921,3287]] res1 = result1['SST'].mean() result2 = df_time.iloc[[1,366,731,1096,1461,1827,2192,2557,2922,3288]] res2 = result2['SST'].mean() result3 = df_time.iloc[[2,367,732,1097,1462,1828,2193,2558,2923,3289]] res3 = result3['SST'].mean()
解决方案
方法一:用Pandas按日序分组(最简洁)
不需要写循环,直接利用Pandas时间索引的dayofyear属性分组,自动处理闰年偏移,一步得到365个日均温度:
df_time = ds1.to_dataframe() # 按一年中的第几天分组,计算每组的温度均值 daily_mean = df_time.groupby(df_time.index.dayofyear)['SST'].mean() # daily_mean是一个Series,索引为1-365,对应一年中每一天的十年平均温度
方法二:用循环实现(满足你的需求)
如果一定要用循环,建议通过dayofyear筛选而非硬编码索引(避免闰年出错):
df_time = ds1.to_dataframe() daily_means = [] # 遍历一年的365天 for day_num in range(1, 366): # 筛选出所有年份中第day_num天的数据 day_data = df_time[df_time.index.dayofyear == day_num]['SST'] # 计算均值并加入列表 daily_means.append(day_data.mean()) # daily_means是包含365个均值的列表,顺序对应第1天到第365天
方法三:直接用Xarray处理(更高效,无需转DataFrame)
Xarray原生支持时间维度的分组操作,代码更简洁,适合气象数据处理:
# 直接对Xarray的DataArray按日序分组,求时间维度的均值 daily_mean_ds1 = ds1.groupby('time.dayofyear').mean(dim='time') # 结果是一个新的DataArray,维度为dayofyear(1-365) # 若需要转成列表或DataFrame: daily_mean_list = daily_mean_ds1.values.tolist() daily_mean_df = daily_mean_ds1.to_dataframe()
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

