1. 作物模型气象数据入门指南刚接触DSSAT、WOFOST和APSIM这三大作物模型时最让我头疼的就是气象数据准备。记得第一次跑模型因为文件格式不对整整折腾了一周都没成功。今天我就用最直白的语言带大家彻底搞懂这些神秘的气象文件。气象数据就像是给作物模型喂饭格式不对就像喂错了食物。三大模型虽然都用文本文件存储气象数据但各有各的饮食习惯。DSSAT用.WTH文件WOFOST用.XXX文件APSIM则用.met文件。别看后缀不同本质上都是带特定格式的文本文件用记事本就能打开编辑。这里有个重要前提我们讨论的都是逐日气象数据。如果你的原始数据是每小时或每3小时一次需要先做日均值处理。比如温度要取日最高温和最低温降雨量要累加当日总量。我建议先用Python或Excel处理好再导入模型否则很容易出错。2. DSSAT气象文件深度解析2.1 文件名命名玄机DSSAT对气象文件名有严格规定必须遵循422的格式。举个例子UFGA7801.WTH前4位(UFGA)气象站代码全大写字母中间2位(78)年份后两位表示1978年最后2位(01)站点编号固定8字符长度多一位少一位都不行我在项目里踩过坑有一次用了5位站代码模型直接报错退出。后来发现DSSAT读取文件时会严格检查第7、8位必须是数字这个细节官方文档都没明确说明。2.2 文件内容详解用记事本打开.WTH文件第一行是元数据格式如下WEATHER DATA : ACNM INSI LAT LONG ELEV TAV AMP REFHT WNDHTACNM必须与文件名前4位一致LAT/LONG建议保留6位小数我用34.583000比34.583更保险ELEV海拔高度单位米TAV年平均气温AMP温度年较差关键参数第二行开始是气象数据固定格式DATE SRAD TMAX TMIN RAIN DEWP WIND PAR EVAP RHUM 13001 12.2 7.8 -14.4 0.0日期用年日序表示130012013年第1天辐射单位是MJ/m²/d注意不是WOFOST的KJ/m²/d温度单位是℃降雨量是mm/d2.3 关键参数AMP计算AMP温度年较差是最容易出错的地方。官方算法是先计算每月平均气温(TmaxTmin)/2找出最热月和最冷月AMP最热月均值-最冷月均值用Python实现import pandas as pd # 假设df是包含Tmax和Tmin的DataFrame df_mon df.groupby(pd.Grouper(keydate, freq1M)).mean() monthly_avg (df_mon[Tmax] df_mon[Tmin])/2 AMP monthly_avg.max() - monthly_avg.min()有个隐藏陷阱DSSAT要求至少1年完整数据才能计算AMP。我有次用了11个月数据模型虽然不报错但模拟结果完全失真。3. WOFOST气象文件实战技巧3.1 灵活的文件命名WOFOST的命名规则就友好多了文件名格式站名编号.年份后三位例如Beijing1021.021表示北京站1号2021年数据总长度不超过250字符实际很少用这么长但要注意每个文件只能存1年数据我有次把5年数据塞进一个文件模型静默失败花了三天才找到原因。3.2 内容格式要点数据部分必须包含7个要素年日序同DSSAT日辐射KJ/m²/d重要单位差异日最低温日最高温气压hPa风速m/s降雨量mm最坑的是辐射单位WOFOST用KJ而DSSAT用MJ。我有次忘记转换单位模拟的小麦产量只有实际值的1/10。建议建立单位检查清单def check_units(data, model_type): if model_type WOFOST: assert data[RAD].max() 1000 # KJ范围 elif model_type DSSAT: assert data[RAD].max() 30 # MJ范围3.3 文件存放位置WOFOST比较挑食气象文件必须放在\METEO\CABOWE\这个路径是硬编码的不能修改。我第一次用就把文件放错位置模型直接提示找不到气象数据。4. APSIM气象文件高效准备4.1 Excel模板法APSIM最人性化的就是提供了Excel模板在安装目录找到Examples\WeatherFiles\MetData.xlsx按模板填写数据注意日期列要转成文本格式另存为文本(空格分隔)(*.prn)手动改后缀为.met我开发了个自动检查脚本可以验证数据有效性import pandas as pd def validate_apsim_met(filepath): df pd.read_csv(filepath, delim_whitespaceTrue) assert year in df.columns assert radn in df.columns # APSIM用radn不是srad assert df[maxt].gt(df[mint]).all() # 最高温最低温4.2 内容格式特点APSIM的.met文件需要这些必备字段year年份day年日序radn日辐射(MJ/m²/d)maxt日最高温mint日最低温rain降雨量有个贴心设计APSIM允许添加注释行以!开头。我习惯在文件头添加数据来源说明方便后期追溯。5. 三大模型对比与避坑指南5.1 格式差异总结用表格直观对比关键差异特征DSSATWOFOSTAPSIM文件后缀.WTH.XXX.met辐射单位MJ/m²/dKJ/m²/dMJ/m²/d温度列名TMAX/TMINTMAX/TMINmaxt/mint单文件年限支持多年仅1年支持多年必备字段4个7个6个5.2 常见错误排查根据我踩过的坑总结这些检查项单位一致性特别是辐射值WOFOST需要DSSAT数值×1000缺失值处理DSSAT用-99WOFOST用NaNAPSIM直接留空日期格式年日序必须连续闰年要包含2月29日文件编码建议统一存为UTF-8避免中文系统下的乱码问题5.3 自动化转换建议对于需要同时支持多个模型的项目我开发了转换脚本框架class WeatherConverter: def to_dssat(self, df): # 实现DSSAT转换逻辑 pass def to_wofost(self, df): # 实现WOFOST转换逻辑 pass def to_apsim(self, df): # 实现APSIM转换逻辑 pass这个框架可以复用基础数据校验逻辑只需要实现各模型特定的格式转换。6. 实战经验分享最近帮某农业研究所处理历史气象数据时遇到个典型问题原始数据有大量缺失值。我的处理步骤是先用Pandas插值补全连续缺失线性插值对长时间段缺失如设备故障使用邻近站点数据添加数据质量标记列在文件注释中说明处理后的数据文件我习惯保留两份原始版带缺失标记模型输入版完整数据这样既保证模型运行又留有数据追溯依据。有个实用技巧在文件名中加入版本号如Beijing_2020_v1.2.WTH。最后特别提醒所有作物模型对气象数据质量都非常敏感。建议先用matplotlib绘制数据时序图肉眼检查异常值。我经常发现自动气象站记录的35℃高温实际是传感器故障真实值可能只有25℃。
第2篇 -- 作物模型(DSSAT、WOFOST、APSIM)气象数据格式详解与实战准备指南
1. 作物模型气象数据入门指南刚接触DSSAT、WOFOST和APSIM这三大作物模型时最让我头疼的就是气象数据准备。记得第一次跑模型因为文件格式不对整整折腾了一周都没成功。今天我就用最直白的语言带大家彻底搞懂这些神秘的气象文件。气象数据就像是给作物模型喂饭格式不对就像喂错了食物。三大模型虽然都用文本文件存储气象数据但各有各的饮食习惯。DSSAT用.WTH文件WOFOST用.XXX文件APSIM则用.met文件。别看后缀不同本质上都是带特定格式的文本文件用记事本就能打开编辑。这里有个重要前提我们讨论的都是逐日气象数据。如果你的原始数据是每小时或每3小时一次需要先做日均值处理。比如温度要取日最高温和最低温降雨量要累加当日总量。我建议先用Python或Excel处理好再导入模型否则很容易出错。2. DSSAT气象文件深度解析2.1 文件名命名玄机DSSAT对气象文件名有严格规定必须遵循422的格式。举个例子UFGA7801.WTH前4位(UFGA)气象站代码全大写字母中间2位(78)年份后两位表示1978年最后2位(01)站点编号固定8字符长度多一位少一位都不行我在项目里踩过坑有一次用了5位站代码模型直接报错退出。后来发现DSSAT读取文件时会严格检查第7、8位必须是数字这个细节官方文档都没明确说明。2.2 文件内容详解用记事本打开.WTH文件第一行是元数据格式如下WEATHER DATA : ACNM INSI LAT LONG ELEV TAV AMP REFHT WNDHTACNM必须与文件名前4位一致LAT/LONG建议保留6位小数我用34.583000比34.583更保险ELEV海拔高度单位米TAV年平均气温AMP温度年较差关键参数第二行开始是气象数据固定格式DATE SRAD TMAX TMIN RAIN DEWP WIND PAR EVAP RHUM 13001 12.2 7.8 -14.4 0.0日期用年日序表示130012013年第1天辐射单位是MJ/m²/d注意不是WOFOST的KJ/m²/d温度单位是℃降雨量是mm/d2.3 关键参数AMP计算AMP温度年较差是最容易出错的地方。官方算法是先计算每月平均气温(TmaxTmin)/2找出最热月和最冷月AMP最热月均值-最冷月均值用Python实现import pandas as pd # 假设df是包含Tmax和Tmin的DataFrame df_mon df.groupby(pd.Grouper(keydate, freq1M)).mean() monthly_avg (df_mon[Tmax] df_mon[Tmin])/2 AMP monthly_avg.max() - monthly_avg.min()有个隐藏陷阱DSSAT要求至少1年完整数据才能计算AMP。我有次用了11个月数据模型虽然不报错但模拟结果完全失真。3. WOFOST气象文件实战技巧3.1 灵活的文件命名WOFOST的命名规则就友好多了文件名格式站名编号.年份后三位例如Beijing1021.021表示北京站1号2021年数据总长度不超过250字符实际很少用这么长但要注意每个文件只能存1年数据我有次把5年数据塞进一个文件模型静默失败花了三天才找到原因。3.2 内容格式要点数据部分必须包含7个要素年日序同DSSAT日辐射KJ/m²/d重要单位差异日最低温日最高温气压hPa风速m/s降雨量mm最坑的是辐射单位WOFOST用KJ而DSSAT用MJ。我有次忘记转换单位模拟的小麦产量只有实际值的1/10。建议建立单位检查清单def check_units(data, model_type): if model_type WOFOST: assert data[RAD].max() 1000 # KJ范围 elif model_type DSSAT: assert data[RAD].max() 30 # MJ范围3.3 文件存放位置WOFOST比较挑食气象文件必须放在\METEO\CABOWE\这个路径是硬编码的不能修改。我第一次用就把文件放错位置模型直接提示找不到气象数据。4. APSIM气象文件高效准备4.1 Excel模板法APSIM最人性化的就是提供了Excel模板在安装目录找到Examples\WeatherFiles\MetData.xlsx按模板填写数据注意日期列要转成文本格式另存为文本(空格分隔)(*.prn)手动改后缀为.met我开发了个自动检查脚本可以验证数据有效性import pandas as pd def validate_apsim_met(filepath): df pd.read_csv(filepath, delim_whitespaceTrue) assert year in df.columns assert radn in df.columns # APSIM用radn不是srad assert df[maxt].gt(df[mint]).all() # 最高温最低温4.2 内容格式特点APSIM的.met文件需要这些必备字段year年份day年日序radn日辐射(MJ/m²/d)maxt日最高温mint日最低温rain降雨量有个贴心设计APSIM允许添加注释行以!开头。我习惯在文件头添加数据来源说明方便后期追溯。5. 三大模型对比与避坑指南5.1 格式差异总结用表格直观对比关键差异特征DSSATWOFOSTAPSIM文件后缀.WTH.XXX.met辐射单位MJ/m²/dKJ/m²/dMJ/m²/d温度列名TMAX/TMINTMAX/TMINmaxt/mint单文件年限支持多年仅1年支持多年必备字段4个7个6个5.2 常见错误排查根据我踩过的坑总结这些检查项单位一致性特别是辐射值WOFOST需要DSSAT数值×1000缺失值处理DSSAT用-99WOFOST用NaNAPSIM直接留空日期格式年日序必须连续闰年要包含2月29日文件编码建议统一存为UTF-8避免中文系统下的乱码问题5.3 自动化转换建议对于需要同时支持多个模型的项目我开发了转换脚本框架class WeatherConverter: def to_dssat(self, df): # 实现DSSAT转换逻辑 pass def to_wofost(self, df): # 实现WOFOST转换逻辑 pass def to_apsim(self, df): # 实现APSIM转换逻辑 pass这个框架可以复用基础数据校验逻辑只需要实现各模型特定的格式转换。6. 实战经验分享最近帮某农业研究所处理历史气象数据时遇到个典型问题原始数据有大量缺失值。我的处理步骤是先用Pandas插值补全连续缺失线性插值对长时间段缺失如设备故障使用邻近站点数据添加数据质量标记列在文件注释中说明处理后的数据文件我习惯保留两份原始版带缺失标记模型输入版完整数据这样既保证模型运行又留有数据追溯依据。有个实用技巧在文件名中加入版本号如Beijing_2020_v1.2.WTH。最后特别提醒所有作物模型对气象数据质量都非常敏感。建议先用matplotlib绘制数据时序图肉眼检查异常值。我经常发现自动气象站记录的35℃高温实际是传感器故障真实值可能只有25℃。