如何将日期型X轴按夜间时段拆分显示?
解决X轴按夜间区块拆分并保留小时刻度的方法
下面分Excel和Python两种常用场景给出具体操作步骤:
一、Excel操作方法
- 预处理数据,新增「夜间区块」辅助列
根据你定义的夜间时段(比如当天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条件替换成你的实际夜间时间范围。- 预处理数据,新增「夜间区块」辅助列
- 给X轴设置分组标签
选中日期列的所有数据,右键选择「创建组」,手动指定每个夜间时段的起始和结束时间,比如选中2月5日20:00到2月6日8:00的单元格,创建组后重命名为“夜间1(2月5日-2月6日)”。重复此操作完成所有夜间区块分组后,图表X轴会自动显示区块标签,同时保留小时刻度。
- 给X轴设置分组标签
二、Python(Matplotlib)操作方法
如果用Python做可视化,可按以下步骤实现:
- 数据预处理,标记夜间区块
用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)- 数据预处理,标记夜间区块
- 绘制图表并设置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()- 绘制图表并设置X轴标签
内容的提问来源于stack exchange,提问作者Leo Lasrado




