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

Python3中Matplotlib报TypeError:datetime.date与float无法执行减法运算

解决Python3中Matplotlib绘图的TypeError: unsupported operand type(s) for -: 'datetime.date' and 'float'

嘿,这个问题我太熟了!从Python2迁移到Python3时,Matplotlib的日期处理确实有个坑——Python2里它会自动帮你把datetime.date对象转成内部可处理的数值,但Python3里这个隐式转换被去掉了,所以才会抛出这个类型错误。

问题根源

你的代码里DF['day']列存储的是datetime.date对象,而Python3的Matplotlib在计算日期刻度时,需要的是datetime.datetime对象或者已经转换为Matplotlib内部日期格式的数值,直接用date对象会触发类型运算错误。

两种修复方案

方案1:直接生成datetime对象(推荐)

修改DataFrame的创建代码,去掉.date(),直接生成datetime.datetime类型的日期:

import matplotlib.pyplot as plt
from pylab import rcParams
import matplotlib.ticker as mtick
import matplotlib.dates as mdates
import numpy as np
import pandas as pd
from datetime import datetime, timedelta

DF = pd.DataFrame({
    # 去掉.date(),直接生成datetime对象
    'day': [datetime(2018,1,1) + timedelta(x+1) for x in range(100)],
    'balance': np.random.normal(100,100,100)
})

rcParams['figure.figsize'] = (12,6) # 补全你截断的代码
plt.plot(DF['day'], DF['balance'])

# 优化日期显示格式
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gcf().autofmt_xdate() # 自动旋转日期标签避免重叠
plt.show()

方案2:将现有date对象转换为Matplotlib可识别的数值

如果你的day列已经是date类型,也可以用mdates.date2num()手动转换:

# 假设DF['day']已经是date对象
plt.plot(mdates.date2num(DF['day']), DF['balance'])

# 记得设置日期格式化器,否则x轴会显示数值而非日期
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gcf().autofmt_xdate()
plt.show()

额外提示

如果你用Pandas的绘图接口(DF.plot(x='day', y='balance')),Pandas会自动处理日期类型转换,也能避免这个问题,代码会更简洁哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:02:49