如何更改显示日期和时间的 x 轴以仅显示月份名称?
Posted
技术标签:
【中文标题】如何更改显示日期和时间的 x 轴以仅显示月份名称?【英文标题】:How do you change an x axis that displays date and time to show only month name? 【发布时间】:2021-01-28 20:50:33 【问题描述】:我有 2 列日期/时间和值的数据框“df”:
import numpy as np
import pandas as pd
df = pd.DataFrame(pd.date_range('2012-06-01','2012-06-04', freq='H'), columns=['date/time'])
data = np.random.randint(5, 100, 73)
temp= pd.DataFrame(data, columns=['Value'])
df['Value']=temp
df.head()
当我用这些数据绘制线图时:
lines=df.plot.line(x='date/time', y='Value')
我得到这张图: enter image description here
我对图表很满意,但我希望我的 x 轴只显示月份名称。同样在我的实际图表中,我有很多不同月份的日期,因此在显示它时,x 轴标签不应重叠。有人可以帮我解决这个问题吗?
我已经看过 .xaxis.set_major_locator 之类的东西,但我无法让它工作。
【问题讨论】:
【参考方案1】:我不得不稍微更改您的代码,因为它使用了超过 3 天的每小时范围,这导致所有月份都是 6 月。此外,您的temp
行是不必要的,因为您可以等效地创建随机整数并将其直接分配给df['Value']
,而无需先创建temp
数据帧。
import numpy as np
import pandas as pd
df = pd.DataFrame(pd.date_range('2011-06-01','2012-06-04', freq='M'), columns=['date/time'])
df['Value'] = np.random.randint(5, 100, len(df.index))
fig = plt.figure()
ax = fig.add_subplot(111)
months_list = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
### Iterate over the TimeStamp objects, calling the month format of each
months = [months_list[dt.month - 1] for dt in df['date/time']]
ax.plot(months, df['Value'])
plt.show()
关于避免重叠刻度标签的部分,您可以对标签进行基本旋转:
ax.tick_params(axis='x', labelrotation=30)
或参考这些答案,这些答案显示了两种不同的方法:
-
Adds a label pad to alternate tick labels
Fine-tune rotation and positions of tick labels
结果如下:
【讨论】:
这里的问题是您仅在制作数据框时才将日期/时间列设置为日期。此外,当我运行代码时,它会显示“'str' object has no attribute 'month'” for line months = [months_list[dt.month - 1] for dt in df['date/time']] 数据/时间列确实由日期(实际上是时间戳)组成,正如您使用 pd.date_range 创建它时在您的代码中一样。这就是允许我们在其上调用 .month 方法的原因。您是否以某种方式将日期/时间列的值格式化为字符串?因为那会导致你提到的错误 谢谢你成功了。一直以来,我的日期/时间都是字符串格式。这可能就是我无法获得任何其他解决方案的原因。以上是关于如何更改显示日期和时间的 x 轴以仅显示月份名称?的主要内容,如果未能解决你的问题,请参考以下文章
重新排列 x 轴以显示多年数据的儒略日期(例如 0-365)一次
Plotly 轴以相反的顺序显示日期(最近到最早)-Python