使用 xticks 的日期时间格式使用 matplotlib 绘制数据的问题

Problem with plotting data with matplotlib using datetime format for xticks

我有一个时间序列,它是从积分时间步长为 1 分钟的数值模拟中获得的。这个时间序列跨越几个月,我想在 x 轴上使用日期。 集成结束后,我将与第一天对应的纪元时间添加到创建为

的时间 numpy 数组中
tt = np.arange(0.0, number_of_days, minute)

我每 10 分钟才收集一次数据点 (tt[::10])。 我通过

将此数组转换为日期格式 '%Y-%m-%d %H:%M:%S'
dtime = np.empty(len(tt[::10]), dtype="S19")
for ind, t in enumerate(tt[::10]):
   daytime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t))
   dtime[ind] = datetime.strptime(daytime, '%Y-%m-%d %H:%M:%S')

print(dtime) 结果:

[b'2020-01-22 00:00:00' b'2020-01-22 00:10:00' b'2020-01-22 00:20:00' ...
 b'2020-06-29 23:30:00' b'2020-06-29 23:40:00' b'2020-06-29 23:50:00']

我将 xticks 格式化为:

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.WeekdayLocator())
plt.gca().xaxis.set_minor_locator(mdates.DayLocator())

我用以下方法绘制此数据:

plt.plot_date(dtime, Y)
plt.gcf().autofmt_xdate()

如果我只使用 plt.plot,我会得到相同的结果。 不幸的是,我没有得到日期的 xticks。 似乎日期没有正确格式化为日期时间格式,以便 matplotlib 理解它。我怀疑问题与dtime有关,我认为应该不是字符串类型。 结果是

我想用这张图绘制这个时间序列,它每天有一个数据点。

我这里有第二个相关问题:如何设置每两周一次的主要报价?

当我将两个数据集绘制在一起时,我得到了这个:

更新: 根据 Andrea 提出的解决方案,我现在可以在同一张图中绘制两个数据集,如下所示

为什么不使用 pd.date_range 生成 dtime 数组?

dtime = pd.date_range(start = '2020-01-22', end = '2020-06-29', freq = '10min')

这样,dtime就是:

DatetimeIndex(['2020-01-22 00:00:00', '2020-01-22 00:10:00',
               '2020-01-22 00:20:00', '2020-01-22 00:30:00',
               '2020-01-22 00:40:00', '2020-01-22 00:50:00',
               '2020-01-22 01:00:00', '2020-01-22 01:10:00',
               '2020-01-22 01:20:00', '2020-01-22 01:30:00',
               ...
               '2020-06-28 22:30:00', '2020-06-28 22:40:00',
               '2020-06-28 22:50:00', '2020-06-28 23:00:00',
               '2020-06-28 23:10:00', '2020-06-28 23:20:00',
               '2020-06-28 23:30:00', '2020-06-28 23:40:00',
               '2020-06-28 23:50:00', '2020-06-29 00:00:00'],
              dtype='datetime64[ns]', length=22897, freq='10T')

使用此代码:

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

dtime = pd.date_range(start = '2020-01-22', end = '2020-06-29', freq = '10min')
X = np.linspace(-10, 10, len(dtime))
Y = np.exp(X) / (np.exp(X) + 1)

plt.plot(dtime, Y)

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval = 7))
plt.gca().xaxis.set_minor_locator(mdates.DayLocator(interval = 1))
plt.setp(plt.gca().xaxis.get_majorticklabels(), rotation = 45 )
plt.gca().set_xlim(dtime[0], dtime[-1])

plt.show()

我得到这个情节:

由于我无法访问您的 Y 数据,因此我生成了一个 sigmoid 函数来绘制该图;将其替换为您的数据。