我有一个由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()
哪个给我:
答案 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()