0

我有一个时间序列,它是从积分时间步长为 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. 不幸的是,我没有得到任何日期。日期似乎没有正确格式化为日期时间格式,以便 matplotlib 理解它。我怀疑这个问题与 dtime 有关,我认为它不应该是字符串类型的。结果是

在此处输入图像描述

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

在此处输入图像描述

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

当我将两个数据集绘制在一起时,我得到了这个: 在此处输入图像描述

更新:基于 Andrea 提出的解决方案,我现在可以在同一张图中绘制两个数据集,如下所示 在此处输入图像描述

4

1 回答 1

1

为什么不用pd.date_rangedtime 来生成数组呢?

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 函数来绘制图表;用您的数据替换它。

于 2020-06-30T22:01:04.350 回答