如何仅在X轴显示月日实现跨年冬季时间序列数据的同图对比?
冬季周期年度时间序列对齐绘制方案
核心思路
通过将不同冬季周期的日期映射到连续的两个虚拟基准年(1900年、1901年),既保留了日期的时间类型属性,又实现了所有周期在同一x轴上对齐,同时避免了冬季时段被拆分到x轴两端的问题。
实现步骤
- 首先确保日期列为datetime格式:
import pandas as pd import plotly.graph_objects as go df['Date'] = pd.to_datetime(df['Date'])
- 定义日期映射逻辑,给每个数据点分配所属冬季周期标签,以及映射后的虚拟基准日期:
def map_winter_date(dt): if dt.month >= 6: # 6月及以后的数据归属当年到下一年的冬季周期,映射到1900年对应日期 winter_label = f"{dt.year}/{dt.year+1}" mapped_dt = dt.replace(year=1900) else: # 6月以前的数据归属上一年到当年的冬季周期,映射到1901年对应日期 winter_label = f"{dt.year-1}/{dt.year}" mapped_dt = dt.replace(year=1901) return winter_label, mapped_dt # 应用映射逻辑到数据集 df[['winter_cycle', 'mapped_date']] = df['Date'].apply(lambda x: pd.Series(map_winter_date(x)))
- 按冬季周期分组绘图,x轴设置为仅显示月日:
fig = go.Figure() # 循环生成每个冬季周期的绘图trace for cycle_label, group_df in df.groupby('winter_cycle'): fig.add_trace(go.Scatter( x=group_df['mapped_date'], y=group_df['Rate'], name=cycle_label, mode='lines' )) # 配置x轴格式,隐藏虚拟年份仅显示月日 fig.update_layout( xaxis = dict( tickformat = '%m/%d', title = '日期' ), yaxis_title = 'Rate数值', title = '不同冬季周期Rate波动对比' ) fig.show()
方案优势
- 逻辑简单易维护,无需复杂的日期偏移计算
- 映射后的
mapped_date依然为datetime类型,不会出现字符串排序错乱、坐标轴间隔异常的问题 - 天然适配6月到次年6月的周期逻辑,不会把冬季时段拆分到x轴两端
- 自动按周期分组生成trace,数据量增加时无需手动调整代码
内容的提问来源于stack exchange,提问作者Soulmanjam87
相关产品推荐
相关产品推荐

