如何消除Matplotlib股票图表中无数据日期造成的间隙?
解决Matplotlib股票图表日期间隙问题
我正在编写Python脚本读取股票数据并生成图表,但周末没有股票数据,导致图表上出现大量日期间隙(图表中可见大量因无数据产生的空白段)。我需要消除这些间隙,移除Matplotlib自动填充的无数据日期,让图表连贯显示,已经尝试各种方法三天,仍未解决。
我的代码:
import pandas as pd import pytz import matplotlib.pyplot as plt import json data = json.loads(open("data.json", "r").read()) local_timezone = pytz.timezone("Asia/Kolkata") data = data[:501] # 提取相关数据并创建pandas DataFrame timestamps = [ pd.to_datetime(row["Data"][2]["ScalarValue"]) for row in data ] values = [float(row["Data"][3]["ScalarValue"]) for row in data] df = pd.DataFrame({"Timestamps": timestamps, "Values": values}) df.set_index("Timestamps", inplace=True) plt.figure(figsize=(12, 6)) plt.plot(df.index, df["Values"], label="原始数据") plt.xlabel("时间戳") plt.ylabel("价格") plt.title( "股票价格" ) plt.legend() plt.grid(True) plt.show()
data.json 文件示例:
[ { "Data": [ { "ScalarValue": "Nifty Bank" }, { "ScalarValue": "price" }, { "ScalarValue": "2023-01-20 06:58:00.000000000" }, { "ScalarValue": "42644.2" } ] }, { "Data": [ { "ScalarValue": "Nifty Bank" }, { "ScalarValue": "price" }, { "ScalarValue": "2023-01-20 06:59:00.000000000" }, { "ScalarValue": "42642.25" } ] }, ... ]
解决方法
核心思路是绕开Matplotlib的自动时间轴填充,用位置索引绘图,再手动替换x轴标签为对应日期,让数据点连续排列。
修改后的完整代码:
import pandas as pd import pytz import matplotlib.pyplot as plt import json data = json.loads(open("data.json", "r").read()) local_timezone = pytz.timezone("Asia/Kolkata") data = data[:501] # 提取数据并转换为本地时区(可选,按需调整) timestamps = [ pd.to_datetime(row["Data"][2]["ScalarValue"]).tz_localize(pytz.utc).tz_convert(local_timezone) for row in data ] values = [float(row["Data"][3]["ScalarValue"]) for row in data] df = pd.DataFrame({"Timestamps": timestamps, "Values": values}) plt.figure(figsize=(12, 6)) # 使用位置索引绘图,彻底消除时间间隙 plt.plot(range(len(df)), df["Values"], label="无间隙数据") # 手动设置x轴标签,控制显示密度避免重叠 plt.xticks( ticks=range(0, len(df), 50), # 每50个数据点显示一个标签 labels=[df["Timestamps"].iloc[i].strftime("%Y-%m-%d %H:%M") for i in range(0, len(df), 50)], rotation=45 ) plt.xlabel("时间戳") plt.ylabel("价格") plt.title("股票价格(无日期间隙)") plt.legend() plt.grid(True) plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
关键细节说明
- 用
range(len(df))替代时间索引作为x轴,这样所有数据点会紧密排列,不会因为缺失日期出现空白。 - 通过
plt.xticks()自定义x轴显示的日期标签,ticks参数决定哪些位置显示标签,labels对应替换为实际的时间字符串,rotation让标签旋转45度避免重叠。 - 时区转换是可选操作,如果你的原始时间戳是UTC时区,可以转换为本地时区让标签更直观。
另一种简化方法(适合快速实现):
直接用pandas的绘图函数并开启x_compat=True,它会自动处理时间轴间隙,但仍需调整标签显示:
df.set_index("Timestamps", inplace=True) df.plot(figsize=(12,6), x_compat=True, label="无间隙数据") plt.gcf().autofmt_xdate() # 自动旋转日期标签 plt.xlabel("时间戳") plt.ylabel("价格") plt.title("股票价格(无日期间隙)") plt.legend() plt.grid(True) plt.show()
内容的提问来源于stack exchange,提问作者Jatin Thakur
相关产品推荐
相关产品推荐

