根据熊猫中的两个日期按月计算总计

时间:2021-05-05 09:36:47

标签: python pandas timestamp

我有一个包含两列日期的数据框:start dateend date。我需要设置一个数据框,其中一年中的所有月份都根据开始和结束日期间隔设置在单独的列中,以便我可以对每个 name 的每个月份的另一列中的值求和。

举例说明:

Original df:

Start Date   End Date   Name   Value
10/22/20     01/25/21   John   100
10/12/20     04/30/21   John   50
02/25/21     None       John   20


Desired df:
Name    Oct_20  Nov_20  Dec_20  Jan_21  Feb_21  Mar_21  Apr_21  May_21 Jun_21   Jul_21  Aug_21  ...
John    150     150     150     150     70      70      70      20      20      20      20      ...

任何有关我如何实现该结果的建议或指示将不胜感激!

1 个答案:

答案 0 :(得分:1)

首先将值转换为日期时间,将非日期时间替换为缺失值并将它们替换为某个 date,然后在列表理解中将所有月份都转换为 Series,用于由 {{3} 进行透视}:

end = '2021-12-31'
df['Start'] = pd.to_datetime(df['Start Date'])
df['End'] = pd.to_datetime(df['End Date'], errors='coerce').fillna(end)

s = pd.concat([pd.Series(r.Index,pd.date_range(r.Start, r.End, freq='M'))
                for r in df.itertuples()])

df1 = pd.DataFrame({'Date': s.index}, s).join(df)

df2 = df1.pivot_table(index='Name',
                      columns='Date',
                      values='Value',
                      aggfunc='sum',
                      fill_value=0)

df2.columns = df2.columns.strftime('%b_%y')
print (df2)
Date  Oct_20  Nov_20  Dec_20  Jan_21  Feb_21  Mar_21  Apr_21  May_21  Jun_21  \
Name                                                                           
John     150     150     150      50      70      70      70      20      20   

Date  Jul_21  Aug_21  Sep_21  Oct_21  Nov_21  Dec_21  
Name                                                  
John      20      20      20      20      20      20