如何实现Python气象图代码按日循环并自动保存生成的图像?
批量生成每日气象图(Meteogram)解决方案
需求背景
现有Python代码仅能生成1987年1月1日的气象图,需改造为循环批量处理1987-01-01至2021-12-31的每一天,自动生成并保存对应日期的气象图。
优化后的完整代码
import pandas as pd import datetime as dt import matplotlib.pyplot as plt import matplotlib.dates as mdates # 读取数据并统一日期格式 IAH = pd.read_excel('IAH.xlsx') IAH['valid'] = pd.to_datetime(IAH['valid']) # 确保日期列可被正确筛选 # 定义批量处理的时间范围 start_date = dt.datetime(1987, 1, 1) end_date = dt.datetime(2021, 12, 31) delta = dt.timedelta(days=1) current_date = start_date while current_date <= end_date: # 设定当日的时间边界 day_start = current_date.replace(hour=0, minute=0, second=0) day_end = current_date.replace(hour=23, minute=59, second=59) # 筛选当日的气象数据(避免全量绘图后裁剪,提升效率) daily_data = IAH[(IAH['valid'] >= day_start) & (IAH['valid'] <= day_end)] # 跳过无数据的日期 if daily_data.empty: current_date += delta continue # 提取当日各气象要素 x = daily_data['valid'] y1 = daily_data['tmpf'] y2 = daily_data['dwpf'] y3 = daily_data['drct'] y4 = daily_data['mslp'] # 创建绘图画布 fig, ax = plt.subplots(3, figsize=(10, 8)) # 绘制温度与露点曲线 ax[0].plot(x, y1, color='blue', label='Temp') ax[0].plot(x, y2, color='green', label='Dew Point') ax[0].set_xbound(day_start, day_end) ax[0].set_ybound(0, 100) ax[0].set_ylabel('TMP & DP') ax[0].xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) ax[0].legend() # 绘制风向数据 ax[1].plot(x, y3, color='black', marker='o') ax[1].set_xbound(day_start, day_end) ax[1].set_ybound(0, 360) ax[1].set_ylabel('WDIR') ax[1].xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) # 绘制海平面气压曲线 ax[2].plot(x, y4, color='red') ax[2].set_xbound(day_start, day_end) ax[2].set_ybound(1000, 1040) ax[2].set_ylabel('MSLP') ax[2].xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) # 调整子图间距避免重叠 fig.tight_layout() # 按日期命名并保存图片 filename = f"{current_date.strftime('%Y%m%d')}_meteogram.png" plt.savefig(filename, dpi=100) # 关闭画布释放内存 plt.close(fig) # 日期步进一天 current_date += delta
核心改进说明
- 日期格式标准化:先将
valid列转为datetime类型,确保日期筛选逻辑准确。 - 高效数据筛选:直接提取当日数据绘图,替代原代码全量绘图后裁剪边界的低效方式。
- 异常处理:跳过无数据的日期,避免生成空图。
- 批量保存:用日期字符串命名图片,方便后续查找。
- 内存优化:每次绘图后关闭画布,防止内存占用过高。
内容的提问来源于stack exchange,提问作者Madeline Statkewicz
相关产品推荐
相关产品推荐

