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

如何使用Python/Pandas从日期字段按月分组,python,pandas,Python,Pandas,我有一个数据帧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

我有一个数据帧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
如何在熊猫身上有效地做到这一点

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
处理

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

试试看,groupby使用pd.Grouper和freq='MS':

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

试试看,groupby使用pd.Grouper和freq='MS':

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
         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
         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.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

如果将日期作为索引,则只需重新采样即可

df.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

使用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

使用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

你已经试过什么了?请共享您的代码。您已经尝试了什么?请分享你的代码。