我有以下数据:
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()
我得到以下图表:
我发现虽然这里的日期是正确的,但是时间(小时、分钟、秒)也显示在 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()
现在我得到以下图表:
我发现 x 轴上的日期全都错了。它们从 1970 年 1 月 1 日开始!问题出在哪里,如何纠正。感谢您的帮助。
由于 seaborn 处理尾随零的方式,认为这没有正确设置。修复此问题的一种方法是在对strftime()数据进行排序后使用将日期时间更改回字符串,如下所示…
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此后的所有内容,以便您看到正确的格式。
xticklabels()
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()
两者都会为您提供以下日期格式......