Pandas 按月和年分组(日期为 datetime64[ns])并按计数汇总

Ole*_*siy 6 python python-datetime pandas pandas-groupby

我有一个数据框,是我在 pandas 中创建的,按日期分组并按游乐设施进行总结。

      date   rides
0   2019-01-01  247279
1   2019-01-02  585996
2   2019-01-03  660631
3   2019-01-04  662011
4   2019-01-05  440848
..         ...     ...
451 2020-03-27  218499
452 2020-03-28  143305
453 2020-03-29  110833
454 2020-03-30  207743
455 2020-03-31  199623

[456 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)

我的date专栏在datetime64[ns].

date     datetime64[ns]
rides             int64
dtype: object
Run Code Online (Sandbox Code Playgroud)

现在我想创建另一个数据框,按月份和年份分组(我有 2019 年和 2020 年的数据)并按乘车次数进行汇总。

理想输出:

Year Month   Rides
2019 January 2000000
2020 March   1000000
Run Code Online (Sandbox Code Playgroud)

Ben*_*n.T 9

您可以从日期列中groupby获取dt.yeardt.month_name 。

print (df.groupby([df['date'].dt.year.rename('year'), 
                   df['date'].dt.month_name().rename('month')])
         ['rides'].sum().reset_index())
   year    month    rides
0  2019  January  2596765
1  2020    March   880003
Run Code Online (Sandbox Code Playgroud)


ALo*_*llz 6

datetime还支持to_period转换,因此我们可以按月对所有内容进行分组。

df.groupby(df.date.dt.to_period('M')).agg('sum')
#           rides
#date            
#2019-01  2596765
#2020-03   880003
Run Code Online (Sandbox Code Playgroud)

在本例中,索引是 a PeriodIndex,它具有许多相同的datetime属性。

PeriodIndex(['2019-01', '2020-03'], dtype='period[M]', name='date', freq='M')
Run Code Online (Sandbox Code Playgroud)

  • @Ben.T 如果您需要一个灵活的函数来允许不同的聚合,那就太好了。例如,可以很容易地将上述内容更改为聚合到“年”、“Y-季度”、“YM”组(实际上更改为“Y”、“Q”、“M”),而不是调用所有属性。基本上它是“重新采样”,但不会为您提供中间的所有“NaN”组。 (3认同)