Pandas resample.plot()报错:'DatetimeIndexResampler'对象无plot属性
解决Pandas resample后调用plot()报错的问题
报错原因
这个AttributeError是因为新版本Pandas(1.0+)不再支持直接对DatetimeIndexResampler对象调用plot(),教程里的代码大概率基于旧版本Pandas编写——旧版本允许跳过聚合步骤直接绘图,但新版本中resample()仅生成重采样规则对象,未执行实际计算,因此没有plot属性。
修复方案
必须先对重采样对象执行聚合操作(如取每月末收盘价、月均值等),得到可绘图的Series/DataFrame后再调用plot()。
基础修复代码(单折线图)
如果只需要每月收盘价的汇总折线(比如每月最后一个交易日的收盘价):
import numpy as np import matplotlib.pyplot as plt import pandas as pd bitcoin = pd.read_csv('BTC-EUR.csv', index_col='Date', parse_dates=True) # 先聚合(last()取每月最后一个Close值),再绘图 bitcoin.loc['2019', 'Close'].resample('M').last().plot() plt.show()
还原教程的“按月拆分彩色折线图”
如果要实现教程里每个月一条彩色折线的效果,用groupby结合月份分组更可靠,兼容所有新版本Pandas:
import numpy as np import matplotlib.pyplot as plt import pandas as pd bitcoin = pd.read_csv('BTC-EUR.csv', index_col='Date', parse_dates=True) # 筛选2019年Close数据,按月份分组 monthly_data = bitcoin.loc['2019', 'Close'].groupby(pd.Grouper(freq='M')) # 遍历每个月的数据绘制折线 for month, values in monthly_data: # 用当月的日期字符串做图例,x轴显示当月的天数 plt.plot(values.index.day, values, label=month.strftime('%Y-%m')) plt.legend(title='Month') plt.xlabel('Day of Month') plt.ylabel('BTC-EUR Close Price') plt.show()
额外验证步骤
- 检查Pandas版本:运行
print(pd.__version__),确认是否为1.0+版本; - 验证索引类型:运行
print(bitcoin.index.dtype),确保输出为datetime64[ns]——如果不是,说明parse_dates=True没生效,可手动转换:bitcoin.index = pd.to_datetime(bitcoin.index)。
内容的提问来源于stack exchange,提问作者Eithan Nakache
相关产品推荐
相关产品推荐

