You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何逐行读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:45:08