Python在轴上将一年中的日期转换为月份
Posted
技术标签:
【中文标题】Python在轴上将一年中的日期转换为月份【英文标题】:Python convert the day of year to month on an axis 【发布时间】:2019-06-04 01:10:59 【问题描述】:我有一个时间序列,我想逐年绘制。我希望数据是每天的,但轴每个月显示为“一月”、“二月”等。
目前我可以获得每日数据,但轴是 1-366(一年中的哪一天)。
或者我可以将月轴设为 1、2、3 等(通过将索引更改为 df.index.month),但是数据是月度的。
如何将年轴转换为月份?或者我该怎么做?
显示每日数据的代码,但坐标轴错误:
# import
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# create fake time series dataframe
index = pd.date_range(start='01-Jan-2012', end='31-12-2018', freq='D')
data = np.random.randn(len(index))
df = pd.DataFrame(data, index, columns=['Data'])
# pivot to get by day in rows, then year in columns
df_pivot = pd.pivot_table(df, index=df.index.dayofyear, columns=df.index.year, values='Data')
df_pivot.plot()
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()
【问题讨论】:
“转换为月”究竟是什么意思,考虑到例如2016 年第 60 天是 2 月 29 日,而 2018 年是 3 月 1 日?但是,您当然可以决定某个特定年份并将索引转回该特定年份的日期时间。 我正在考虑使用非闰年。也许这是最好的方法?如果我们要选择 2000 年并将一年中的每一天都转换为其日期时间,然后再格式化?所以第 5 天是 2000 年 1 月 5 日,然后你可以从中去掉月份。你是这个意思吗?如果是这样,我该怎么做? 【参考方案1】:简单地将日期时间索引添加到您的透视数据框可能更直接。
df_pivot.index = pd.date_range(
df.index.max() - pd.Timedelta(days=df_pivot.shape[0]),
freq='D', periods=df_pivot.shape[0])
df_pivot.plot()
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()
生成的图具有所需的轴:
此方法还具有优于公认答案的优势,无论您的开始和结束日期如何。例如,如果您将 index
的结束日期更改为 end='30-Jun-2018'
,则轴会很好地适应数据:
【讨论】:
【参考方案2】:这可以使用xticks function 来完成。只需在plt.show()
前添加以下代码:
plt.xticks(np.linspace(0,365,13)[:-1], ('Jan', 'Feb' ... 'Nov', 'Dec'))
或以下使月份名称出现在月中:
plt.xticks(np.linspace(15,380,13)[:-1], ('Jan', 'Feb' ... 'Nov', 'Dec'))
【讨论】:
也许你的意思是plt.xticks(np.linspace(0,365,13)[:-1], ('Jan', 'Feb' ... 'Nov', 'Dec'))
?
@ImportanceOfBeingErnest 你说得对,我误读了文档的那一部分。我已更新我的答案以包含此内容。
是的,这很好用。我猜它不是 100% 准确的,但在图表上它是不可见的。感谢您快速准确的回复。以上是关于Python在轴上将一年中的日期转换为月份的主要内容,如果未能解决你的问题,请参考以下文章
在Python里 请问怎么将数字日期转换成英文月份加数字日期? 并且替换分隔符?例子如下