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

如何仅在X轴显示月日实现跨年冬季时间序列数据的同图对比?

冬季周期年度时间序列对齐绘制方案

核心思路

通过将不同冬季周期的日期映射到连续的两个虚拟基准年(1900年、1901年),既保留了日期的时间类型属性,又实现了所有周期在同一x轴上对齐,同时避免了冬季时段被拆分到x轴两端的问题。

实现步骤

  1. 首先确保日期列为datetime格式:
import pandas as pd
import plotly.graph_objects as go

df['Date'] = pd.to_datetime(df['Date'])
  1. 定义日期映射逻辑,给每个数据点分配所属冬季周期标签,以及映射后的虚拟基准日期:
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)))
  1. 按冬季周期分组绘图,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:51:01