【问题标题】:Pandas: Sum month-over-month based on start- and end date rangesPandas:根据开始和结束日期范围逐月求和
【发布时间】:2021-08-14 11:53:17
【问题描述】:

this previous post 的基础上,我有一个如下数据框:

in_df:

Index    Name    Value    Start Date   End Date
0        John    100      21/05/2021   31/12/2021
1        John    50       01/01/2021   31/07/2021
2        John    20       20/02/2021   31/10/2021
3        Mary    40       15/01/2021   30/04/2021
4        Mary    30       20/03/2021   31/08/2021
5        Mary    20       20/03/2021   15/05/2021

我需要设置一个数据框,其中包含一年中的所有月份,并基于 in_df 聚合并汇总每个 name 的总和,如下所示:

out_df:

Index    Name    Jan-21  Feb-21  Mar-21  Apr-21  May-21  June-21  Jul-21  Aug-21  Sep-21  Oct-21  Nov-21  Dec-21   
0        John    50      70      70      70      170     170      170     120     120     120     100     100
1        Mary    40      40      90      90      50      30       30      30      0       0        0       0

重要的是,一年中的每个月只表示为一次列,每个 name 有一个总和值。 @jezrael 在上面引用的帖子中发布的建议将为每个条目创建一个单独的月份列,从而导致多个 Mar-21,例如,在上面的示例中,Index 4Index 5both 的开始日期都在 3 月.

如果有任何建议让我可以解决这个问题,我们将不胜感激!

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    按照步骤进行

    1. StartEnd日期列中的字符串解析为日期时间
    end = pd.to_datetime(df['End Date'], dayfirst=True)
    start = pd.to_datetime(df['Start Date'], dayfirst=True)
    
    1. 生成对应StartEnd日期列的每月周期范围
    df['period'] = [pd.period_range(*v, freq='M') for v in zip(start, end)]
    
    1. Explode periodpivot 上的数据框@具有聚合功能的分解数据框 sum
    out = df.explode('period').pivot_table(
            'Value', 'Name', 'period', aggfunc='sum', fill_value=0)
    out.columns = out.columns.strftime('%b-%y')
    

    结果

    >>> out
    
    period  Jan-21  Feb-21  Mar-21  Apr-21  May-21  Jun-21  Jul-21  Aug-21  Sep-21  Oct-21  Nov-21  Dec-21
    Name                                                                                                  
    John        50      70      70      70     170     170     170     120     120     120     100     100
    Mary        40      40      90      90      50      30      30      30       0       0       0       0
    

    【讨论】:

      猜你喜欢
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多