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
相关产品推荐
相关产品推荐

