如何逐行读取Pandas DataFrame数据并将月度数据绘制成时间序列图
解决思路
核心是先把你手上的宽格式(按年存月度数据)表转换为标准的时间序列结构,再做可视化,具体操作步骤如下:
步骤1:数据格式转换
首先用pandas把宽表转成「日期-数值」对应的长表,示例代码如下:
import pandas as pd import matplotlib.pyplot as plt # 定义月份缩写到数字的映射,用于生成日期 month_mapping = { 'JAN':1, 'FEB':2, 'MAR':3, 'APR':4, 'MAY':5, 'JUN':6, 'JUL':7, 'AUG':8, 'SEP':9, 'OCT':10, 'NOV':11, 'DEC':12 } # 宽表转长表,保留年份列,把月份列转为行 long_df = df.melt(id_vars='YEAR', var_name='MONTH', value_name='VALUE') # 替换月份为数字 long_df['MONTH'] = long_df['MONTH'].map(month_mapping) # 生成标准datetime格式的日期列,默认取每月1号作为日期标识 long_df['DATE'] = pd.to_datetime(long_df[['YEAR', 'MONTH']].assign(DAY=1)) # 按日期升序排列 long_df = long_df.sort_values('DATE').reset_index(drop=True)
步骤2:绘制时间序列图
连续时间序列图(按时间先后排列所有月度数据)
plt.figure(figsize=(15, 6)) plt.plot(long_df['DATE'], long_df['VALUE'], linewidth=1) # 可选配置 plt.xlabel('时间') plt.ylabel('对应数值') plt.title('1870年以来逐月数据时间序列') plt.grid(alpha=0.3) plt.xticks(rotation=45) # 日期多的时候旋转x轴标签避免重叠 plt.tight_layout() plt.show()
分年度月度对比图(每年的月度数据放在同一x轴对比)
如果你不需要连续时间序列,而是想对比不同年份的月度变化,可以不用转长表,直接遍历原宽表绘图即可:
plt.figure(figsize=(12, 6)) # 逐行遍历每年的数据 for _, row in df.iterrows(): plt.plot(range(1,13), row[1:], label=f"{int(row['YEAR'])}年") # 可选配置 plt.xlabel('月份') plt.ylabel('对应数值') plt.title('各年度月度数值对比') plt.xticks(range(1,13), month_mapping.keys()) plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left') # 图例放图外侧避免遮挡 plt.tight_layout() plt.show()
注意事项
- 若原数据存在缺失值,可提前用
df.dropna()删除对应行,或用df.fillna()填充后再操作,避免绘图异常 - 时间跨度较大时可以给折线加上透明度(
alpha=0.7),或采样部分年份展示,避免图面过于杂乱
内容的提问来源于stack exchange,提问作者Nayan
相关产品推荐
相关产品推荐

