如何在NetCDF文件中提取多年指定日期范围的温度数据?
刚好我之前处理过类似的NetCDF时间筛选需求,给你分享两种靠谱的方法——用Python的xarray库(适合编程自动化)和CDO工具(适合命令行快速处理),完美匹配你的数据集结构~
方法一:使用Python xarray库(灵活可编程)
你的数据集里time是维度但没有对应坐标,而days变量存储了实际的日期,所以第一步要把days设为time维度的坐标,这样就能用xarray强大的时间筛选功能了。
import xarray as xr # 1. 读取NetCDF文件 ds = xr.open_dataset("你的文件名.nc") # 2. 将days变量设置为time维度的坐标(关键步骤) ds = ds.assign_coords(time=ds.days) # 3. 构建时间筛选条件:每年5月30日至8月18日 # 逻辑:5月30日及以后 + 6-7月整月 + 8月18日及以前 time_mask = ( ((ds.time.dt.month == 5) & (ds.time.dt.day >= 30)) | ((ds.time.dt.month.isin([6, 7])) | ((ds.time.dt.month == 8) & (ds.time.dt.day <= 18))) ) # 4. 应用筛选条件,丢弃不符合的时间点 filtered_ds = ds.where(time_mask, drop=True) # 5. 保存筛选后的结果到新文件 filtered_ds.to_netcdf("筛选后的温度数据_2001-2018.nc")
小提示:
- 如果你的数据集里
time维度已经是datetime类型,那跳过第2步直接筛选就行; - 这段代码会自动处理闰年的日期差异,不用额外调整。
方法二:使用CDO工具(命令行快速处理)
CDO(Climate Data Operators)是处理气候数据的神器,适合不想写代码的场景,有两种实现方式:
方式A:bash循环遍历每年(最准确,适配闰年)
这种方式会逐个年份筛选目标日期范围,再合并结果,完全不用担心闰年的日期偏移问题:
# 初始化临时文件列表 temp_files="" # 遍历2001到2018年 for year in {2001..2018}; do # 筛选当前年份5月30日至8月18日的数据,保存为临时文件 cdo seldate,${year}-05-30,${year}-08-18 你的文件名.nc tmp_${year}.nc # 将临时文件加入列表 temp_files="${temp_files} tmp_${year}.nc" done # 合并所有临时文件为最终结果 cdo mergetime ${temp_files} 筛选后的温度数据_2001-2018_cdo.nc # 清理临时文件 rm tmp_*.nc
方式B:按年积日筛选(快速但需注意闰年)
如果你的数据里没有闰年影响(或者可以忽略),可以直接按年积日筛选:5月30日对应年积日150(非闰年),8月18日对应230,命令更简洁:
# 先筛选2001-2018年,再筛选年积日150-230的日期 cdo selday,150/230 -seldate,2001-01-01,2018-12-31 你的文件名.nc 筛选后的温度数据_2001-2018_cdo.nc
小提示:
- 确保你的系统已经安装了CDO工具(可以用
cdo --version检查); - 方式A虽然多几步,但准确性最高,推荐优先使用。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

