如何在Matplotlib中对比特币数据集日期排序并仅显示年月X轴?
比特币数据集日期排序优化与图表日期格式调整
问题现状
当前代码运行后存在两个问题:
- 日期列未被解析为datetime类型,导致排序按字符串顺序而非时间顺序,出现日期乱序
- 图表X轴显示全部日期,未按「月份+年份」格式展示
当前图表效果:
数据示例格式:
解决方案
步骤1:正确解析日期并完成时间排序
先将Date列转换为datetime类型,再设置为索引并排序,确保时间顺序正确:
import pandas as pd import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter # 处理日期列:转换为datetime类型,format需匹配你的数据日期格式 Bitcoin_Historical['Date'] = pd.to_datetime(Bitcoin_Historical['Date'], format='%m/%d/%Y') train1 = Bitcoin_Historical[['Date','Price']] # 转换Price为数值类型 train1['Price'] = pd.to_numeric(train1['Price'].astype(str).str.replace(',', ''), errors='coerce') # 设置日期为索引并排序 train2 = train1.set_index('Date').sort_index()
步骤2:调整图表X轴日期显示格式
使用DateFormatter设置仅显示月份名称+年份,并调整X轴刻度避免重叠:
plt.figure(figsize=(15, 5)) plt.plot(train2['Price']) # 设置X轴日期格式:完整月份名称+年份(如January 2020) date_form = DateFormatter("%B %Y") plt.gca().xaxis.set_major_formatter(date_form) # 配置每月显示一个刻度,可根据数据量调整interval值 from matplotlib.dates import MonthLocator plt.gca().xaxis.set_major_locator(MonthLocator(interval=1)) # 旋转日期标签,避免重叠 plt.gcf().autofmt_xdate() plt.xlabel('Date', fontsize=12) plt.ylabel('Price', fontsize=12) plt.title("Closing price distribution of bitcoin", fontsize=15) plt.show()
完整修改代码
import pandas as pd import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter, MonthLocator # 处理日期列 Bitcoin_Historical['Date'] = pd.to_datetime(Bitcoin_Historical['Date'], format='%m/%d/%Y') train1 = Bitcoin_Historical[['Date','Price']] # 转换Price为数值类型 train1['Price'] = pd.to_numeric(train1['Price'].astype(str).str.replace(',', ''), errors='coerce') # 设置日期索引并排序 train2 = train1.set_index('Date').sort_index() # 绘制图表 plt.figure(figsize=(15, 5)) plt.plot(train2['Price']) # 配置X轴日期格式 date_form = DateFormatter("%B %Y") plt.gca().xaxis.set_major_formatter(date_form) plt.gca().xaxis.set_major_locator(MonthLocator(interval=1)) plt.gcf().autofmt_xdate() plt.xlabel('Date', fontsize=12) plt.ylabel('Price', fontsize=12) plt.title("Closing price distribution of bitcoin", fontsize=15) plt.show()
关键说明
pd.to_datetime的format参数需匹配你的数据日期格式,示例为MM/DD/YYYY(对应%m/%d/%Y),若为其他格式需对应修改(如%d/%m/%Y表示日/月/年)- 若要显示缩写月份(如Jan 2020),可将
DateFormatter的参数改为"%b %Y" MonthLocator(interval=1)设置每月显示一个刻度,数据量较大时可调整interval为2或更大值,减少刻度数量
内容的提问来源于stack exchange,提问作者Spatdy
相关产品推荐
相关产品推荐

