python 在x轴上绘制日期

9udxz4iz  于 2023-03-28  发布在  Python
关注(0)|答案(5)|浏览(120)

我正试图根据日期绘制信息。我有一个格式为“01/02/1991”的日期列表。
我通过执行以下操作来转换它们:

x = parser.parse(date).strftime('%Y%m%d'))

得到19910102
然后我尝试使用num 2date

import matplotlib.dates as dates
new_x = dates.num2date(x)

绘图:

plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True)

但我得到一个错误。它说“ValueError:year is out of range”.有解决方案吗?

lyfkaqu1

lyfkaqu11#

您可以使用plot()而不是plot_date()更简单地完成此操作。
首先,将字符串转换为Python datetime.date的示例:

import datetime as dt

dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here

然后绘图:

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

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()

结果:

jexiocij

jexiocij2#

我的声誉太低,无法在@bernie回复中添加评论,回复为@user1506145。我遇到了同样的问题。

它的答案是一个区间参数,它可以解决问题

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import datetime as dt

np.random.seed(1)

N = 100
y = np.random.rand(N)

now = dt.datetime.now()
then = now + dt.timedelta(days=100)
days = mdates.drange(now,then,dt.timedelta(days=1))

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=5))
plt.plot(days,y)
plt.gcf().autofmt_xdate()
plt.show()
8fsztsew

8fsztsew3#

正如@KyssTao所说,help(dates.num2date)表示x必须是一个浮点数,给出自0001- 01-01以来的天数加1。因此,19910102不是2/Jan/1991,因为如果你从0001-01- 01开始计算19910101天,你会得到54513年或类似的数字(除以365.25,一年中的天数)。
使用datestr2num代替(参见help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991'
hvvq6cgz

hvvq6cgz4#

调整@Jacek Szałńga的答案,以使用图形fig和相应的轴对象ax

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import datetime as dt

np.random.seed(1)

N = 100
y = np.random.rand(N)

now = dt.datetime.now()
then = now + dt.timedelta(days=100)
days = mdates.drange(now,then,dt.timedelta(days=1))

fig = plt.figure()
ax = fig.add_subplot(111)
    
ax.plot(days,y)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
ax.xaxis.set_major_locator(mdates.DayLocator(interval=5))
ax.tick_params(axis='x', labelrotation=45)

plt.show()
juud5qan

juud5qan5#

date = raw_date[:20]
# plot lines
plt.plot(date,target[:20] , label = "Real")
plt.xlabel('Date', fontsize=10)
plt.ylabel('Ylabel', fontsize=10)
plt.legend()
plt.title('Date to show')
plt.xticks(date_to_show_as_list,rotation=90)
plt.figure().set_figwidth(30)
plt.show()

相关问题