我有一个由日期时间组成的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()


这给了我:

python - 如何告诉 Pandas 将多年中的相同月份分组?-LMLPHP

最佳答案

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

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 将多年中的相同月份分组?-LMLPHP

关于python - 如何告诉 Pandas 将多年中的相同月份分组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56779489/

10-12 19:33
查看更多