gpt4 book ai didi

python - matplotlib.dates(和 datestr2num)的绘图刻度中的日期格式问题

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:36 24 4
gpt4 key购买 nike

我使用 matplotlib.dates 绘制一个条形图,其中包含在特定日期发生的实例(以字符串列表的形式呈现),并使用 matplotlib.dates.datestr2num 显示每个日期的两组数据(根据顶部回答 Python matplotlib multiple bars )。

但是,对于该月 12 日以下的日期,该图将以 MM/DD/YY 格式解释日期,而对于该月 12 日以上的日期,该图将以 DD/MM/YY 格式解释日期,导致数据在绘图中跳跃。我认为问题可能在于我如何使用 datestr2num,但不确定如何强制它采用一种或另一种格式。

import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, AutoDateLocator, AutoDateFormatter, datestr2num

days = ['30/01/2019', '31/01/2019', '01/02/2019', '02/02/2019', '03/02/2019', '04/02/2019']
adata = [1, 9, 10, 3, 7, 6]
bdata = [1, 2, 11, 3, 6, 2]

x=datestr2num(days)

w=0.25
fig = plt.figure(figsize = (8,4))
ax = fig.add_subplot(111)
ax.bar(x-w, adata, width=2*w, color='g', align='center', tick_label = days)
ax.bar(x+w, bdata, width=2*w, color='r', align='center', tick_label = days)
ax.xaxis_date()
ax.xaxis.set_major_locator(AutoDateLocator(minticks=3, interval_multiples=False))
ax.xaxis.set_major_formatter(DateFormatter("%d/%m/%y"))

plt.show()

在上面的示例中,adatabdata 位于后续日期(1 月 30 日至 2 月 4 日),所有条形都显示为彼此相邻,但绘图显示 1 月 2 日到 4 月 2 日之间的数据,导致数据出现乱序。

任何帮助或澄清都会有帮助,谢谢!

Image of the output from above

最佳答案

看起来 datestr2num()来电 dateutil.parser.parse(d, default=default)dateutil.parser.parse 有一个 kwarg dayfirstdatestr2num() 没有提供向前传递参数的方法。如果您将日期列表传递给 datestr2num() ,它将 assume month first .

>>> [dateutil.parser.parse(day, dayfirst=True) for day in days]
[
datetime.datetime(2019, 1, 30, 0, 0),
datetime.datetime(2019, 1, 31, 0, 0),
datetime.datetime(2019, 2, 1, 0, 0),
datetime.datetime(2019, 2, 2, 0, 0),
datetime.datetime(2019, 2, 3, 0, 0),
datetime.datetime(2019, 2, 4, 0, 0)
]

>>> datestr2num(days)
[737089. 737090. 737061. 737092. 737120. 737151.]

>>> datestr2num(days, dayfirst=True)
Traceback (most recent call last):
File "C:\Users\bcohan\Downloads\so.py", line 22, in <module>
print(datestr2num(days, dayfirst=True))
TypeError: datestr2num() got an unexpected keyword argument 'dayfirst'

我建议首先使用datetime处理日期,然后运行其余的。 (除非重写原始 days 列表中的字符串是合理的。)

x = datestr2num([
datetime.strptime(day, '%d/%m/%Y').strftime('%m/%d/%Y')
for day in days
])

这是一个完整的工作脚本。

from datetime import datetime
import matplotlib.pyplot as plt
from matplotlib.dates import (
DateFormatter, AutoDateLocator, AutoDateFormatter, datestr2num
)

days = [
'30/01/2019', '31/01/2019', '01/02/2019',
'02/02/2019', '03/02/2019', '04/02/2019'
]
adata = [1, 9, 10, 3, 7, 6]
bdata = [1, 2, 11, 3, 6, 2]

x = datestr2num([
datetime.strptime(day, '%d/%m/%Y').strftime('%m/%d/%Y')
for day in days
])
w = 0.25

fig = plt.figure(figsize=(8, 4))
ax = fig.add_subplot(111)
ax.bar(x - w, adata, width=2 * w, color='g', align='center', tick_label=days)
ax.bar(x + w, bdata, width=2 * w, color='r', align='center', tick_label=days)
ax.xaxis_date()
ax.xaxis.set_major_locator(
AutoDateLocator(minticks=3, interval_multiples=False))
ax.xaxis.set_major_formatter(DateFormatter("%d/%m/%y"))

plt.show()

enter image description here

关于python - matplotlib.dates(和 datestr2num)的绘图刻度中的日期格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59738557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com