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

如何避免Matplotlib绘制Datetime类型X轴时自动添加原数据无的日期

解决Matplotlib绘制Datetime轴时自动填充缺失日期的问题

当使用Matplotlib绘制包含datetime类型X轴的DataFrame数据时,坐标轴会自动补充原数据中不存在的日期(比如示例里的6月5日),以下是几种避免该问题的方法:

示例代码(问题复现)

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime

d1 = datetime.datetime(2023, 6, 1)
d2 = datetime.datetime(2023, 6, 2)
d3 = datetime.datetime(2023, 6, 3)
d4 = datetime.datetime(2023, 6, 4)
d6 = datetime.datetime(2023, 6, 6)
d7 = datetime.datetime(2023, 6, 7)

df = pd.DataFrame({'created_at': [d1, d2, d3, d4, d6, d7],
                   'price': [100, 200, 400, 350, 180, 30]})

x1 = df.created_at
y1 = df.price

fig, ax = plt.subplots(figsize=(12, 4))
fig.autofmt_xdate()

locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)

ax.plot(x1,y1)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)

解决方案

方法1:将X轴视为类别变量处理

直接用数据的索引作为X轴,再手动设置刻度标签为原日期,让Matplotlib不把日期当作连续轴处理:

import pandas as pd
import matplotlib.pyplot as plt
import datetime

d1 = datetime.datetime(2023, 6, 1)
d2 = datetime.datetime(2023, 6, 2)
d3 = datetime.datetime(2023, 6, 3)
d4 = datetime.datetime(2023, 6, 4)
d6 = datetime.datetime(2023, 6, 6)
d7 = datetime.datetime(2023, 6, 7)

df = pd.DataFrame({'created_at': [d1, d2, d3, d4, d6, d7],
                   'price': [100, 200, 400, 350, 180, 30]})

fig, ax = plt.subplots(figsize=(12, 4))
# 用数据索引作为X轴坐标
ax.plot(range(len(df)), df['price'])
# 设置刻度位置与数据行一一对应
ax.set_xticks(range(len(df)))
# 将刻度标签替换为格式化后的日期,旋转45度避免重叠
ax.set_xticklabels(df['created_at'].dt.strftime('%m-%d'), rotation=45)

plt.tight_layout()
plt.show()

方法2:使用Pandas内置绘图接口

Pandas的plot方法默认会将datetime列当作离散类别处理,不会自动填充缺失日期,代码更简洁:

import pandas as pd
import matplotlib.pyplot as plt
import datetime

d1 = datetime.datetime(2023, 6, 1)
d2 = datetime.datetime(2023, 6, 2)
d3 = datetime.datetime(2023, 6, 3)
d4 = datetime.datetime(2023, 6, 4)
d6 = datetime.datetime(2023, 6, 6)
d7 = datetime.datetime(2023, 6, 7)

df = pd.DataFrame({'created_at': [d1, d2, d3, d4, d6, d7],
                   'price': [100, 200, 400, 350, 180, 30]})

# 直接用Pandas绘图,自动处理离散日期
df.plot(x='created_at', y='price', figsize=(12,4), rot=45)
plt.tight_layout()
plt.show()

方法3:自定义Matplotlib刻度定位器

手动指定X轴刻度为数据中存在的日期,覆盖默认的连续时间轴逻辑:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime

d1 = datetime.datetime(2023, 6, 1)
d2 = datetime.datetime(2023, 6, 2)
d3 = datetime.datetime(2023, 6, 3)
d4 = datetime.datetime(2023, 6, 4)
d6 = datetime.datetime(2023, 6, 6)
d7 = datetime.datetime(2023, 6, 7)

df = pd.DataFrame({'created_at': [d1, d2, d3, d4, d6, d7],
                   'price': [100, 200, 400, 350, 180, 30]})

x1 = df.created_at
y1 = df.price

fig, ax = plt.subplots(figsize=(12, 4))
fig.autofmt_xdate()

ax.plot(x1, y1)
# 强制X轴刻度仅使用数据中存在的日期
ax.set_xticks(x1)
# 保留简洁的日期格式化样式
ax.xaxis.set_major_formatter(mdates.ConciseDateFormatter(mdates.AutoDateLocator()))

plt.tight_layout()
plt.show()

原因说明

Matplotlib默认会将datetime类型的X轴解析为连续时间轴,因此会自动填充时间区间内的所有缺失日期。如果你的数据是离散的日期点,需要明确告诉Matplotlib仅使用现有数据的刻度值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:32:46