如何使用Python / Pandas从“日期”字段按月分组

时间:2019-03-02 02:12:36

标签: python pandas

我有一个Dataframe df,如下所示:

date               value_1    value_2
2018.07.06           10          0
2018.07.14           20          1
2018.07.27           20          2
2018.08.06           30          1
2018.08.09           40          3
2018.08.13           20          2
2018.09.10           30          1
2018.09.22           50          2
2018.10.09           20          3
2018.10.27           20          1

我需要按月对上述数据进行分组,以得到如下输出:

date              value_1    value_2
2018.07.01           50          3
2018.08.01           90          6
2018.09.01           80          3
2018.10.01           40          4

如何在熊猫中有效地做到这一点?

4 个答案:

答案 0 :(得分:3)

尝试使用带有freq ='MS'的pd.Grouper进行分组:

df.groupby(pd.Grouper(freq='MS', key='date')).sum().reset_index()

输出:

        date  value_1  value_2
0 2018-07-01       50        3
1 2018-08-01       90        6
2 2018-09-01       80        3
3 2018-10-01       40        4

而且,如果您想恢复点日期格式,可以使用以下方法:

df_out = df.groupby(pd.Grouper(freq='MS', key='date')).sum().reset_index()

df_out['date'] = df_out['date'].dt.strftime('%Y.%m.%d')

df_out

输出:

         date  value_1  value_2
0  2018.07.01       50        3
1  2018.08.01       90        6
2  2018.09.01       80        3
3  2018.10.01       40        4

答案 1 :(得分:2)

使用

df.date=pd.to_datetime(df.date)
df.groupby(df.date+pd.offsets.MonthBegin(-1)).sum()
Out[171]: 
            value_1  value_2
date                        
2018-07-01       50        3
2018-08-01       90        6
2018-09-01       80        3
2018-10-01       40        4

答案 2 :(得分:1)

如果将日期作为索引,则就像重新采样一样简单。

df.resample('MS').sum()

如果没有索引索引,则可以set_index

df.set_index('date').resample('MS').sum()

两个都给你

            value_1  value_2
date                        
2018-07-01       50        3
2018-08-01       90        6
2018-09-01       80        3
2018-10-01       40        4

答案 3 :(得分:0)

使用dt访问器从日期列获取月份:

df = pd.read_csv(r'C:\Users\Tim\Desktop\data.txt')
df['date'] = pd.to_datetime(df['date'])
df.groupby(df['date'].dt.month).sum()

这将创建以下输出:

     value_1    value_2
date        
7   50  3
8   90  6
9   80  3
10  40  4