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

使用plt.specgram绘制频谱图时,设置日期格式化器后日期偏移至1970的解决方法

解决plt.specgram频谱图x轴日期显示为1970年的问题

问题场景

使用plt.specgram绘制时间范围为2005-2007的数据集频谱图时,设置x轴日期格式化器和定位器后,图表x轴日期却变成了1970年。

代码示例

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

df=pd.read_csv('Data.csv')
df.Date=pd.to_datetime(df.Date)
df=df.set_index('Date')
plt.figure(figsize=(20,10))
plt.specgram(df, Fs=1)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=3))

数据样例

Date Value
2005-05-01 0.52264
2005-05-02 0.45656
... ...
2007-02-27 0.558954
2007-02-28 0.679884

问题原因

plt.specgram默认把x轴设成从0开始的样本索引(整数),不是实际的时间戳。当你直接给这个整数轴套日期格式化器时,matplotlib会把这些整数当成UNIX时间戳(从1970-01-01开始的秒数),自然就显示出1970年的日期了。

解决方法

修改后的代码

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.dates import date2num

# 读取并处理数据
df = pd.read_csv('Data.csv')
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')

plt.figure(figsize=(20,10))
# 绘制频谱图,同时获取返回的时间轴、频率轴和谱图数据
freqs, times, Sxx = plt.specgram(df['Value'], Fs=1)

# 将起始日期转换成matplotlib内部识别的数值格式
start_date_num = date2num(df.index[0])
# 因为Fs=1表示每天一个采样点,times里的数值就是起始日期后的天数,累加得到实际日期的数值
actual_dates_num = start_date_num + times

# 获取当前坐标轴,替换x轴刻度为实际日期对应的数值
ax = plt.gca()
ax.set_xticks(actual_dates_num)
# 设置日期显示格式和3个月间隔的刻度
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))
# 旋转x轴标签,避免重叠
plt.xticks(rotation=45)

plt.tight_layout()
plt.show()

关键细节

  • 如果你的采样频率不是1(比如每小时一个采样点,Fs=24),需要调整日期转换的计算:actual_dates_num = start_date_num + times/24,保证时间增量和实际采样间隔匹配。
  • date2num的作用是把pandas的datetime对象转换成matplotlib内部用的浮点数(代表从1970-01-01开始的天数),这样才能正确映射到日期轴。

内容的提问来源于stack exchange,提问作者Lover Coffee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:15:43