Python读取固定格式多表TXT文件,计算集合均值并绘制等值线图
解决方案:批量处理结构化文本并计算可视化
一、数据读取与结构化拆分(Pandas高效实现)
你的数据是按年份块重复的固定结构,每个块4行:年份站名行、月份行、2行纬度对+数据。直接用read_csv配合分块逻辑更高效,无需逐行读取。
代码实现
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取全部数据,按任意数量空格分割 df_raw = pd.read_csv('your_data.txt', sep=r'\s+', header=None, engine='python') # 每个数据块占4行,计算总块数 n_blocks = len(df_raw) // 4 all_dfs = [] for i in range(n_blocks): # 提取当前块的4行数据 block = df_raw.iloc[i*4 : (i+1)*4] # 提取年份和站名(第一行前两个有效元素) year = block.iloc[0, 0] station = block.iloc[0, 1] # 提取月份作为后续列名(第二行非空元素) months = block.iloc[1].dropna().tolist() # 提取数据行,拆分纬度对与月份数据 data_rows = block.iloc[2:4].reset_index(drop=True) data_rows.columns = ['lat1', 'lat2'] + months # 补充年份和站名字段 data_rows['year'] = year data_rows['station'] = station all_dfs.append(data_rows) # 合并所有块为一个完整DataFrame combined_df = pd.concat(all_dfs, ignore_index=True)
为什么比逐行读取高效?
Pandas底层基于C实现,批量处理速度远快于Python原生readline循环,尤其适配数千块的大数据量场景。
二、计算各月份的集合均值
按纬度对分组,计算每个纬度对下各月份的跨年份均值:
# 按lat1、lat2分组,计算月份列的均值 monthly_mean = combined_df.groupby(['lat1', 'lat2'])[months].mean().reset_index()
三、绘制等值线图
假设lat1和lat2为网格坐标,用matplotlib的contourf绘制:
# 转换为网格格式 lat1_unique = monthly_mean['lat1'].unique() lat2_unique = monthly_mean['lat2'].unique() X, Y = np.meshgrid(lat1_unique, lat2_unique) # 以Month1为例绘制等值线图,其他月份只需替换列名 Z = monthly_mean.pivot(index='lat2', columns='lat1', values='Month1').values plt.figure(figsize=(10, 6)) contour = plt.contourf(X, Y, Z, cmap='viridis') plt.colorbar(contour, label='Mean Value') plt.xlabel('Latitude 1') plt.ylabel('Latitude 2') plt.title('Monthly Mean Contour Map (Month1)') plt.show()
四、常见问题排查
- 列数不一致问题:检查原始文本是否存在缺失行,用
df_raw.isna().sum()查看空值分布,按需调整分块逻辑。 - 年份/站名提取错误:确保第一行仅包含年份和站名两个有效元素,
sep=r'\s+'会自动忽略多余空格。 - 等值线网格异常:若lat1、lat2非连续网格值,可使用
scipy.interpolate.griddata进行插值补全。
内容的提问来源于stack exchange,提问作者KuKaKi
相关产品推荐
相关产品推荐

