【问题标题】:How to sum specific columns based on dates如何根据日期对特定列求和
【发布时间】:2015-10-14 20:49:22
【问题描述】:

下面给出两个数据框:

df1

     Start Date  End Date                   
 0   20110706    20110803                   
 1   20110803    20110907   

df2

     DATE       50      51      52      53      54  
  0  20110706   3.51    2.51    1.51    0.51    0   
  1  20110801   10.98   9.98    8.98    7.98    6.98    
  2  20110808   9.45    8.45    7.45    6.45    5.45    
  3  20110906   0       1       23.2    0       1.2 

基于 df1,我如何修改 df2,以便根据日期在 df1 开始日期(左包括)内的范围对列进行求和。

修改后的 df2 日期包括在内。(开始日期和结束日期范围包含在 df 中)

       Start Date  End Date    50      51      52      53      54
  0    20110706    20110803   14.49   12.49   10.49   8.49    6.98
  1    20110803    20110907    9.45    9.45    30.65   6.45    6.65

如何做到这一点?

【问题讨论】:

  • 所以要明确一点,您想基本上对 df2 中的 DATE 键进行内部连接,使其在开始/结束日期范围内?
  • @Tgsmith61591,正确,并且还对范围内的日期值求和。
  • 您已将其标记为 excel 您想要特定于 excel 或 pandas 的答案吗?
  • @EdChum,我做了更正,我删除了 excel 标签。谢谢
  • @EdChum,将日期字符串重新格式化为 YYYYMMDD 数字,感谢您的通知,也许这将使解决过程更简单

标签: python date pandas


【解决方案1】:

由于日期在Start DateEnd Date 中重复,因此不清楚如何处理df2 中恰好位于开头或结尾的日期;是左包还是右包。假设它是左包含的,您可以这样做

df1['Start Date'] = pd.DatetimeIndex(df1['Start Date'])
df1.set_index('Start Date', inplace=True)

df2['DATE'] = pd.to_datetime(df2.DATE)
df2.set_index('DATE', inplace=True)

sums = df2.groupby(df1.index.asof).sum()
pd.concat([df1, sums], axis=1)

【讨论】:

  • 我假设左包,感谢您的验证!
  • 当我这样做时,它会导致 NaN 或所有数字的空值。也许是转换问题?
  • 嗯.. 为我工作。他们的关键步骤是倒数第二个。首先检查两个帧上的索引是否为日期时间索引。然后检查map(df1.index.asof, df2.index) 的输出。这是指示组的数组(df1.index.asof 是一个应用于df2 索引的函数)。对于df2.index 中的每个日期,输出应该是该日期之前df1.index 的最新日期。
  • 由于某种原因df2['DATE'] = pd.to_datetime(df2.DATE) 将 DATE 结果的 df2 索引设为1970-01-01 00:00:00.0 20110706
  • 发现问题了!用df2['DATE'] = pd.to_datetime(df["DATE"], format="%Y%m%d") 替换df2['DATE'] = pd.to_datetime(df2.DATE) 解决了它!感谢您的帮助!
猜你喜欢
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多