如何告诉大熊猫将多年中的相同月份分组?

时间:2019-06-26 19:02:17

标签: python pandas

我有一个由21-JAN-2016格式的日期时间组成的dataFrame,我用pd.to_datetime(df[0])打了它。我试图对数据进行分组,以便并排绘制跨几年的同一个月。例如,#出现在2015年,2016年,2017年等的#个事件中。(因此,四个并排的小节并排聚集在一起),然后#个出现在2015年,2016年,2017年等的#个事件中。

现在,我有以下代码,我认为它们大部分都能正常工作,但是我不确定,因为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()

哪个给我:

enter image description here

1 个答案:

答案 0 :(得分:1)

您当前正在按月份和年份分组。您只需要将结果堆叠到表中即可。

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()

result