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

如何消除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:36:03