如何重置Pandas DataFrame索引以在同一张图上叠加不同年份数据
嘿,我完全懂你的困扰——两组间隔一年的数据画出来各占图表的两边,根本没法直观对比对吧?别着急,咱们可以通过对齐时间轴的相对日期来解决这个问题,把两年的数据都映射到同一段时间区间里,这样就能完美叠加展示了!下面给你两种实用的解决方案:
方法1:用“一年中的第几天”作为统一X轴
这种方法简单直接,把每个日期转换成1-366的数值,忽略年份差异,直接基于全年天数绘图:
import pandas as pd import matplotlib.pyplot as plt # 假设你的扩展均值数据列叫'extended_mean' # 给两个DataFrame添加“一年中的第几天”列 df1['day_of_year'] = df1.index.dayofyear df2['day_of_year'] = df2.index.dayofyear # 绘制叠加图 plt.figure(figsize=(10, 6)) plt.plot(df1['day_of_year'], df1['extended_mean'], label='Year 1', alpha=0.7) plt.plot(df2['day_of_year'], df2['extended_mean'], label='Year 2', alpha=0.7) # 美化图表 plt.xlabel('Day of Year') plt.ylabel('Extended Mean') plt.title('Overlayed Extended Mean (Two Years)') plt.legend() plt.grid(alpha=0.3) plt.show()
小提示:处理闰年问题
如果其中一年是闰年,2月29日会导致day_of_year多一天,你可以把这一天映射到2月28日对应的天数,避免X轴错位:
# 把闰年的2月29日(day_of_year=60)替换为2月28日的数值(59) df1.loc[df1.index.dayofyear == 60, 'day_of_year'] = 59 df2.loc[df2.index.dayofyear == 60, 'day_of_year'] = 59
方法2:替换年份,保留日期格式
如果你想让X轴显示月份(比如“Jan”“Mar”),更直观展示季节变化,可以把其中一个DataFrame的年份替换成和另一个一致:
# 复制df2并修改年份为df1的起始年份 df2_aligned = df2.copy() target_year = df1.index[0].year df2_aligned.index = df2_aligned.index.map(lambda dt: dt.replace(year=target_year)) # 现在两个DataFrame的索引日期年份相同,直接叠加绘图 plt.figure(figsize=(10, 6)) plt.plot(df1.index, df1['extended_mean'], label='Year 1', alpha=0.7) plt.plot(df2_aligned.index, df2_aligned['extended_mean'], label='Year 2', alpha=0.7) # 设置X轴日期自动旋转,避免重叠 plt.gcf().autofmt_xdate() plt.xlabel('Date') plt.ylabel('Extended Mean') plt.title('Overlayed Extended Mean (Two Years)') plt.legend() plt.grid(alpha=0.3) plt.show()
两种方法都能实现你要的叠加效果,你可以根据图表的展示需求来选:方法1适合看全年的整体趋势,方法2适合按月份对比细节。
内容的提问来源于stack exchange,提问作者JayBee
相关产品推荐
相关产品推荐

