我有一个由日期时间组成的dataFrame,格式为21-JAN-2016
,用pd.to_datetime(df[0])
命中。我试图对数据进行分组,以便并排绘制跨几年的同一个月。例如,在2015年,2016年,2017年1月出现的#个事件等。(因此,四个并排的小节并排在一起),然后在2015年,2016年,2017年2月出现了#个事件。 。
现在,我有以下代码,我认为它们在大多数情况下都可以正常工作,但是我不确定,因为x轴无法正确标记月份。现在它会抛出一个AttributeError: 'MultiIndex' object has no attribute 'strftime'
,但是如果我删除了index.strftime("%Y-%b")
,它会以一个错误的x轴标签进行绘制,而且我不确定我如何理解它,以便我的标签显示这4年中的每一年,以及其下的月份。这是我的代码,如下所示:
#!/usr/bin/python
import pandas as pd
import matplotlib.pyplot as plt
import calendar
file = 'dates.txt'
# Convert datetimes
df = pd.read_csv("dates.txt", header=None) # Format: 359 21-JAN-2016
df["dates"] = pd.to_datetime(df[0]) # Format: 388 3-JUL-2015 2015-07-03
### Group data by year per month
by_year_per_month = by_year_per_month = df["dates"].groupby([(df.dates.dt.month),(df.dates.dt.year)]).count()
labels_by_year_per_month = by_year_per_month.index.strftime("%Y-%b")
### Label
by_year_per_month.plot(kind="bar", ax=ax)
ax.set_xticklabels(labels_by_year_per_month)
# Show plot
plt.show()
我以为可以使用
df["dates"].groupby([(df.dates.dt.month.to_period('M')),(df.dates.dt.year)]).count()
格式化月份标签,但这给了我AttributeError: 'RangeIndex' object has no attribute 'to_period'
。奖金:
不知道是否可以在这里问第二个问题,所以请让我知道是否应该打开一个单独的问题,但是作为奖励,我真的很想知道如何在图表上显示每个月的群集,以便它们可以并排显示。 -方面,它与其他分组之间存在一定的差距。即将Jan [15,16,17,18]分组,然后在Feb [15,16,17,18]之前留一个空格,而不是在所有内容之间留有均匀的空格。基本上只是为了清理它并使它更易于阅读。
编辑1:
将代码更新为:
#!/usr/bin/python
import pandas as pd
import matplotlib.pyplot as plt
import calendar
file = 'dates.txt'
# Convert datetimes
df = pd.read_csv("dates.txt", header=None) # Format: 359 21-JAN-2016
df["dates"] = pd.to_datetime(df[0]) # Format: 388 3-JUL-2015 2015-07-03
### Group data by month per year
result = df["dates"].groupby([df.dates.dt.month, df.dates.dt.year]).count().unstack()
#result.columns = result.columns.droplevel(0)
result.index.name = 'month'
result.plot(kind="bar")
# Show plot
plt.show()
这给了我:
最佳答案
您目前正在按月份和年份分组。您只需要将结果堆叠到表中即可。
by_year_per_month.unstack()
然后,您应该能够绘制数据。
dates = pd.DatetimeIndex(start='2016-01-01', freq='d', periods=356 * 4)
df = pd.DataFrame({'date': dates, 'value': np.random.randn(356 * 4)})
# Summing sample data. You want `count` in your example.
result = df.groupby((df.date.dt.month, df.date.dt.year)).sum().unstack()
result.columns = result.columns.droplevel(0)
result.index.name = 'month'
result.plot()
关于python - 如何告诉 Pandas 将多年中的相同月份分组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56779489/