DataFrame绘图异常:2020年曲线错误及双年份合并绘图问题
问题解答
1. 2020年曲线显示异常的常见原因
- 日期处理问题:2020是闰年,若
date列仅存储月日(如02-29),但解析时按非闰年逻辑处理,会导致日期错位或缺失;或是date列格式不统一(混合字符串与datetime对象),绘图时数据顺序混乱,曲线扭曲。 - 数据质量问题:2020年的
power列存在大量空值、0值或极端异常值,导致曲线出现断崖、跳跃等异常形态。 - 轴范围自动适配问题:2020年数据的功率范围与2019年差异较大,绘图时自动调整的轴范围会压缩正常趋势,使曲线看起来异常。
- 未排序日期:绘图前未对2020年的
date列排序,曲线按原始行顺序绘制,呈现乱序状态。
2. 合并两年曲线到同一图表的实现方法
以下以matplotlib和seaborn为例,给出具体实现步骤:
方法一:手动筛选分组绘制
import pandas as pd import matplotlib.pyplot as plt # 筛选并排序两年数据 df_2019 = df[df['year'] == 2019].sort_values('date') df_2020 = df[df['year'] == 2020].sort_values('date') # 统一日期轴为月日格式(忽略年份,确保对齐) df_2019['month_day'] = pd.to_datetime(df_2019['date'].dt.strftime('%m-%d'), format='%m-%d') df_2020['month_day'] = pd.to_datetime(df_2020['date'].dt.strftime('%m-%d'), format='%m-%d') # 绘制双曲 plt.figure(figsize=(12,6)) plt.plot(df_2019['month_day'], df_2019['power'], label='2019年') plt.plot(df_2020['month_day'], df_2020['power'], label='2020年') plt.xlabel('日期(月-日)') plt.ylabel('功率') plt.title('2019-2020年每日功率趋势') plt.legend() plt.xticks(rotation=45) plt.show()
方法二:用seaborn的hue参数分组绘制
import seaborn as sns # 统一日期为月日格式 df['month_day'] = pd.to_datetime(df['date'].dt.strftime('%m-%d'), format='%m-%d') plt.figure(figsize=(12,6)) sns.lineplot(data=df, x='month_day', y='power', hue='year', marker='o', linestyle='-') plt.xlabel('日期(月-日)') plt.ylabel('功率') plt.title('2019-2020年每日功率趋势') plt.legend(title='年份') plt.xticks(rotation=45) plt.show()
3. 是否需要重构DataFrame格式?
不是必须,但重构为「月日日期为索引、年份为列」的格式会让绘图更简洁,也便于后续对比分析。
重构示例:
# 创建月日列并转为datetime格式 df['month_day'] = pd.to_datetime(df['date'].dt.strftime('%m-%d'), format='%m-%d') # 透视表重构数据结构 pivot_df = df.pivot(index='month_day', columns='year', values='power').sort_index()
重构后仅需一行代码即可绘图:
pivot_df.plot(figsize=(12,6), title='2019-2020年每日功率趋势') plt.xlabel('日期(月-日)') plt.ylabel('功率') plt.xticks(rotation=45) plt.show()
这种格式的优势是数据结构清晰,便于计算两年功率差值、均值等对比指标,同时绘图代码更简洁。
内容的提问来源于stack exchange,提问作者Robson
相关产品推荐
相关产品推荐

