使用xarray isel选取NASA DAYMET日期范围数据时年份更新异常问题
问题根因
你代码的核心问题是误用了xarray的isel()函数的索引逻辑:isel()是基于数据集全局时间轴的位置索引取值,你计算的beg_day/end_day是单年的年积日(比如每年6月1日通常是当年第152天),但你直接将单年的年积日传入作用于全时段数据集的isel(time=spec_day),永远取到的是整个数据集时间轴第spec_day个位置的记录,也就是第一年的对应日期数据,自然所有输出的实际数据都相同。
另外注意你原代码中定义的end_date = dt.datetime(spec_year,7,1)只会取每年6月的数据,要实现6-8月提取的需求,需要把结束日期改为9月1日。
修复方案(两种可选)
方案1:改用sel()按日期值筛选(更推荐,无需计算索引,不易出错)
无需计算年积日,直接按日期范围筛选对应时段数据,代码更简洁容错性更高:
for spec_year in range(2000, 2004): # 要取4年数据范围的话调整为2000到2004 print(f"处理年份:{spec_year}") start_date = dt.datetime(spec_year, 6, 1) end_date = dt.datetime(spec_year, 9, 1) # 6-8月完整时段,slice左闭右开所以设为9月1日 # 筛选当前年份夏季的所有降水数据 prcp_summer = prcp_clip.sel(time=slice(start_date, end_date)) # 遍历每日数据导出 for day_idx in range(len(prcp_summer.time)): prcp_1day_export = prcp_summer.isel(time=day_idx) current_date = prcp_1day_export.time.dt.strftime("%Y%m%d").item() # 导出tif prcp_1day_export.rio.to_raster(f"prcp_1day_export_{current_date}.tif") # 绘图导出 fig, ax = plt.subplots(figsize = (20,10)) prcp_1day_export.plot(ax=ax, robust=True, cbar_kwargs={'label': 'mm/day'}) ga_shape_lcc.plot(ax = ax, color = 'none', edgecolor = 'red') fig.savefig(f"prcp_1day_export_{current_date}.png") plt.close(fig) # 避免循环生成大量图占满内存 print("Finished")
方案2:保留年积日计算逻辑,先筛选单年数据再取索引
如果需要沿用原来的年积日计算逻辑,需要先把单年的数据从全时段数据集中拆分出来,再基于单年的时间轴做isel索引:
for spec_year in range(2000, 2004): print(f"处理年份:{spec_year}") # 先筛选当前年份的所有数据 prcp_year = prcp_clip.sel(time=prcp_clip.time.dt.year == spec_year) start_date = dt.datetime(spec_year, 6, 1) end_date = dt.datetime(spec_year, 9, 1) beg_day = (start_date - dt.datetime(spec_year, 1, 1)).days end_day = beg_day + 92 for spec_day in range(beg_day, end_day): prcp_1day_export = prcp_year.isel(time=spec_day) # 后续导出、绘图逻辑和原代码一致即可
内容的提问来源于stack exchange,提问作者SamShuster
相关产品推荐
相关产品推荐

