You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将日期型X轴按夜间时段拆分显示?

解决X轴按夜间区块拆分并保留小时刻度的方法

下面分Excel和Python两种常用场景给出具体操作步骤:

一、Excel操作方法

    1. 预处理数据,新增「夜间区块」辅助列
      根据你定义的夜间时段(比如当天20:00到次日8:00),在Excel里新增一列,用公式自动生成区块标签。示例公式(需根据你的起始日期和夜间时段调整):
    =IF(AND(HOUR(A2)>=20,HOUR(A2)<=23),"夜间"&INT((A2-DATE(2025,2,5))/1)+1&"("&TEXT(A2,"m月d日")&"-"&TEXT(A2+1,"m月d日")&")",IF(AND(HOUR(A2)>=0,HOUR(A2)<=8),"夜间"&INT((A2-DATE(2025,2,5))/1)+1&"("&TEXT(A2-1,"m月d日")&"-"&TEXT(A2,"m月d日")&")",""))
    

    公式里的DATE(2025,2,5)替换成你的第一个夜间时段的起始日期,HOUR条件替换成你的实际夜间时间范围。

    1. 给X轴设置分组标签
      选中日期列的所有数据,右键选择「创建组」,手动指定每个夜间时段的起始和结束时间,比如选中2月5日20:00到2月6日8:00的单元格,创建组后重命名为“夜间1(2月5日-2月6日)”。重复此操作完成所有夜间区块分组后,图表X轴会自动显示区块标签,同时保留小时刻度。

二、Python(Matplotlib)操作方法

如果用Python做可视化,可按以下步骤实现:

    1. 数据预处理,标记夜间区块
      用Pandas读取数据后,自定义函数生成区块标签:
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    
    # 读取Excel数据,自动解析日期时间列
    df = pd.read_excel("你的数据文件.xlsx", parse_dates=["日期时间"])
    
    # 自定义函数生成夜间区块标签
    def get_night_block(dt):
        # 定义夜间时段:20:00-次日8:00
        if 20 <= dt.hour <= 23:
            block_num = (dt.date() - pd.to_datetime("2025-02-05").date()).days + 1
            return f"夜间{block_num}({dt.strftime('%m月%d日')}-{(dt + pd.Timedelta(days=1)).strftime('%m月%d日')})"
        elif 0 <= dt.hour <= 8:
            block_num = ((dt - pd.Timedelta(days=1)).date() - pd.to_datetime("2025-02-05").date()).days + 1
            return f"夜间{block_num}({(dt - pd.Timedelta(days=1)).strftime('%m月%d日')}-{dt.strftime('%m月%d日')})"
        else:
            return ""
    
    df["夜间区块"] = df["日期时间"].apply(get_night_block)
    
    1. 绘制图表并设置X轴标签
      先设置小时刻度,再在对应区块的中间位置添加夜间标签:
    fig, ax = plt.subplots(figsize=(12, 6))
    
    # 绘制图表(这里以折线图为例,根据你的需求替换成柱状图等)
    ax.plot(df["日期时间"], df["数值列"])
    
    # 设置X轴为每小时一个刻度,显示小时和分钟
    ax.xaxis.set_major_locator(mdates.HourLocator(interval=1))
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
    
    # 给每个夜间区块添加顶部标签
    night_blocks = df[df["夜间区块"] != ""].groupby("夜间区块")["日期时间"].agg(["min", "max"])
    for block, times in night_blocks.iterrows():
        mid_time = (times["min"] + times["max"]) / 2
        # 计算标签位置,避免和刻度重叠
        ax.text(mdates.date2num(mid_time), ax.get_ylim()[0] - 0.05*(ax.get_ylim()[1]-ax.get_ylim()[0]),
                block, ha="center", va="top")
    
    # 调整底部空间,防止标签被截断
    plt.subplots_adjust(bottom=0.2)
    plt.xticks(rotation=45)
    plt.show()
    

内容的提问来源于stack exchange,提问作者Leo Lasrado

火山引擎 最新活动