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

如何用FixedLocator设置datetime64[ns]类型X轴的特定日期?

解决matplotlib设置datetime64[ns]类型X轴特定刻度的报错问题

报错原因

matplotlib在渲染日期轴时,会将datetime64[ns]类型的日期内部转换为浮点数(表示从基准时间开始的天数),而FixedLocator仅支持数值类型输入。直接传入datetime对象会触发类型不匹配的运算错误,也就是你遇到的UFuncTypeError。

解决方法

方法1:将日期转换为matplotlib兼容的数值格式

使用matplotlib.dates.date2num()函数,把datetime对象转换成matplotlib能识别的数值,再传入FixedLocator:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.ticker import FixedLocator
import matplotlib.dates as mdates

df = pd.DataFrame({"date": ["2022-01-01", "2022-01-02", "2022-01-03", "2022-01-04"],
                   "sales": [100, 200, 300, 400]})
df["date"] = pd.to_datetime(df["date"])

ax = sns.lineplot(data=df, x="date", y="sales")

# 转换日期为matplotlib数值格式
selected_dates = df["date"][::2]
date_values = mdates.date2num(selected_dates)
ax.xaxis.set_major_locator(FixedLocator(date_values))

# 可选:设置刻度标签为日期格式,避免显示数值
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.xticks(rotation=45)
plt.show()

方法2:使用日期专用的FixedDateLocator

matplotlib的dates模块提供了FixedDateLocator,可以直接接收datetime对象,无需手动转换数值,代码更简洁:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

df = pd.DataFrame({"date": ["2022-01-01", "2022-01-02", "2022-01-03", "2022-01-04"],
                   "sales": [100, 200, 300, 400]})
df["date"] = pd.to_datetime(df["date"])

ax = sns.lineplot(data=df, x="date", y="sales")

# 直接传入datetime序列到FixedDateLocator
selected_dates = df["date"][::2]
ax.xaxis.set_major_locator(mdates.FixedDateLocator(selected_dates))

# 设置标签格式
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.xticks(rotation=45)
plt.show()

补充说明

两种方法都能实现自定义日期刻度的需求,方法2更贴合日期类型的处理逻辑,推荐优先使用。如果需要对刻度位置做额外数值运算,方法1会更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:25:18