如何用Python正确计算2月每日海温数据的月最小、平均和最大值?
如何用Python正确计算2月每日海温数据的月最小、平均和最大值?
我来帮你梳理下当前代码的问题,再给你一个更可靠的解决方案:
先说说你之前代码的核心问题
第一个版本(双索引变量)的问题
你用了ind_time_28和ind_time_29两个独立的计数器,这会导致数据覆盖:平年的填充位置从0开始,闰年的填充位置也从0开始,直接把前面平年的数据覆盖了。而且虽然数组总长度刚好是311,但填充顺序完全混乱,再加上初始的0值没被完全覆盖,才会出现最小值为0、最大值反而比平均值小的诡异结果。
第二个版本(单索引变量)的问题
你改用单个ind_time后,切片的计算逻辑错了:平年和闰年的天数不同,不能用天数*ind_time来计算起始位置。比如第8个平年结束后,ind_time变成7,下一个闰年ind_time变成8,切片起始位置是29*8=232,但此时数组的224-231位置是空的(初始0),后续闰年的切片还会超出数组总长度,导致维度不匹配的错误。
另外,手动指定日期切片还可能踩「是否包含最后一天」的坑,不如直接按月份筛选更可靠。
改进后的解决方案:用列表收集数据再合并
不用手动初始化数组、计算索引,直接把每年2月的数据收集到列表里,最后合并成大数组,这样既避免了索引错误,又能准确获取所有2月数据:
import xarray as xr import numpy as np import copernicusmarine # 打开数据集,筛选指定区域和深度 DS = copernicusmarine.open_dataset( dataset_id="cmems_mod_glo_phy_my_0.083deg_P1D-m", minimum_longitude=-1.68, maximum_longitude=-1.56, minimum_latitude=49.63, maximum_latitude=49.67, minimum_depth=0, maximum_depth=0 ) # 用来存储每年2月的海温数据 february_data = [] # 遍历2010到2020年 for year in range(2010, 2021): print(f"处理年份:{year}") # 直接筛选该年份2月的所有数据,自动适配平年闰年 feb_subset = DS.thetao.sel( time=(DS.time.dt.year == year) & (DS.time.dt.month == 2) ) # 将当月数据添加到列表 february_data.append(feb_subset.data) # 按时间轴(第0轴)合并所有年份的2月数据 var_arr = np.concatenate(february_data, axis=0) # 计算统计值,用nan开头的函数忽略缺失值 minimum = np.nanmin(var_arr) print(f"最低温度:{minimum}") mean_temp = np.nanmean(var_arr) print(f"平均温度:{mean_temp}") maximum = np.nanmax(var_arr) print(f"最高温度:{maximum}")
为什么这个方法更靠谱?
- 自动适配平年闰年:用
dt.month ==2筛选,不用手动判断年份和天数,完全避免日期切片的问题。 - 无索引错误:列表收集数据后合并,不会出现填充位置重叠、超出数组长度的问题,所有数据都是实际的海温值,没有初始0值干扰统计结果。
- 代码更简洁:去掉了复杂的索引计算逻辑,可读性和维护性更好。
备注:内容来源于stack exchange,提问作者Camille
相关产品推荐
相关产品推荐

