小能豆

matplotlib 中 x 轴上的日期格式

javascript

我有以下数据:

    ID      Date  Chemical  Group
0    6  06-12-21        21      1
1   12  07-03-22        26      2
2   11  08-03-22        28      1
3   13  08-03-22        29      2
4   15  08-03-22        28      1
5   14  09-03-22        26      2
6    7  16-12-21        23      2
7    8  16-12-21        24      2
8    9  16-12-21        23      2
9   10  16-12-21        25      1
10   1  20-11-21        21      1
11   2  26-11-21        19      2
12   3  26-11-21        31      2
13   5  26-11-21        32      1
14   4  27-11-21        31      2

我设置了日期列的格式,对其进行排序并打印:

maindf['Date'] =  pd.to_datetime(maindf['Date'], format='%d-%m-%y')
maindf.sort_values('Date', inplace=True)
print(maindf)

日期得到正确识别:

    ID       Date  Chemical  Group
10   1 2021-11-20        21      1
11   2 2021-11-26        19      2
12   3 2021-11-26        31      2
13   5 2021-11-26        32      1
14   4 2021-11-27        31      2
0    6 2021-12-06        21      1
6    7 2021-12-16        23      2
7    8 2021-12-16        24      2
8    9 2021-12-16        23      2
9   10 2021-12-16        25      1
1   12 2022-03-07        26      2
2   11 2022-03-08        28      1
3   13 2022-03-08        29      2
4   15 2022-03-08        28      1
5   14 2022-03-09        26      2

我绘制了箱线图:

import seaborn as sns
sns.boxplot(data=maindf, x='Date', y='Chemical', hue='Group')
plt.xticks(rotation=20)
plt.show()

我得到以下图表:

1.png

我发现虽然这里的日期是正确的,但是时间(小时、分钟、秒)也显示在 x 轴上,并且所有这些都设置为 0。我想删除这些,因此我在 x 轴上设置了日期格式,然后再次显示图表:

sns.boxplot(data=maindf, x='Date', y='Chemical', hue='Group')
from matplotlib.dates import DateFormatter
dtFmt = DateFormatter('%d-%m-%y') # define the formatting
plt.gca().xaxis.set_major_formatter(dtFmt) 
plt.xticks(rotation=20)
plt.show()

现在我得到以下图表:

2.png

我发现 x 轴上的日期全都错了。它们从 1970 年 1 月 1 日开始!问题出在哪里,如何纠正。感谢您的帮助。


阅读 8

收藏
2025-01-13

共1个答案

小能豆

由于 seaborn 处理尾随零的方式,认为这没有正确设置。修复此问题的一种方法是在对strftime()数据进行排序后使用将日期时间更改回字符串,如下所示…

maindf['Date'] =  pd.to_datetime(maindf['Date'])
maindf.sort_values('Date', inplace=True)
maindf['Date'] = maindf['Date'].dt.strftime('%d-%m-%Y') ## Change to format you need
sns.boxplot(data=maindf, x='Date', y='Chemical', hue='Group')
plt.xticks(rotation=40)
plt.show()

另一个选择是使用 get & setxticklabels()删除T此后的所有内容,以便您看到正确的格式。

maindf['Date'] =  pd.to_datetime(maindf['Date'])
maindf.sort_values('Date', inplace=True)
sns.boxplot(data=maindf, x='Date', y='Chemical', hue='Group')
plt.gca().set_xticklabels([date_text.get_text().split("T")[0] for date_text in plt.gca().get_xticklabels()])
plt.xticks(rotation=40)
plt.show()

两者都会为您提供以下日期格式......

1.png

2025-01-13