如何在Python中绘制日粒度季节性时间序列图表并生成对应DataFrame
实现方案
前置依赖
你需要提前安装以下常用Python数据处理库:
pandas:用于时间序列数据清洗、格式转换matplotlib:用于可视化绘图
步骤1:构造目标格式DataFrame
首先对原始时间序列做格式转换,直接生成你需要的「索引为dd/mm日期、列对应各年份」的结构:
import pandas as pd # 读取原始数据,注意加dayfirst=True适配你当前的日/月/年日期格式 # 如果数据已经在内存里,可以跳过读取步骤,直接把你的数据转成datetime索引即可 raw_df = pd.read_csv( "你的数据文件路径.csv", index_col=0, parse_dates=True, dayfirst=True ) # 提取年份、月日维度 raw_df["year"] = raw_df.index.year raw_df["day_month"] = raw_df.index.strftime("%d/%m") # 可选:如果需要排除闰年2月29日避免对齐问题,执行以下代码 # raw_df = raw_df[~raw_df["day_month"].eq("29/02")] # 生成目标DataFrame,这里以处理A列数据为例,多列可以自行循环调整values参数 target_df = raw_df.pivot( index="day_month", columns="year", values="A" )
生成的target_df就完全符合你的要求:索引是dd/mm格式的年内日期,每一列对应对应年份的日度数值,可直接用于后续分析。
步骤2:绘制季节性对比图表
基于上述生成的target_df,直接遍历各年份列绘制曲线即可,代码如下:
import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ["SimHei"] # 解决中文显示问题,不需要可以删除 plt.figure(figsize=(14, 6)) # 遍历每一年绘制曲线 for year in target_df.columns: plt.plot( target_df.index, target_df[year], label=str(year), alpha=0.7, linewidth=1.2 ) # 优化x轴刻度,避免日度标签拥挤,仅显示每月首日 month_ticks = [f"01/{i:02d}" for i in range(1, 13)] month_labels = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"] plt.xticks( ticks=[target_df.index.get_loc(t) for t in month_ticks if t in target_df.index], labels=month_labels ) plt.xlabel("月份") plt.ylabel("数值") plt.title("各年份季节性日度数据对比") plt.legend(bbox_to_anchor=(1.02, 1), loc="upper left") plt.tight_layout() plt.show()
优化说明
- 若需要处理多列数据(A-I),可以写循环遍历
raw_df的数值列,分别生成对应target_df和图表即可 - 若数据存在缺失值,可以用
target_df = target_df.interpolate()做线性插值补全,避免曲线断裂 - 当年份数量较多时,可以降低
alpha参数值、调细linewidth,避免曲线重叠看不清
内容的提问来源于stack exchange,提问作者spcol
相关产品推荐
相关产品推荐

