通过对两个日期之间的值求和来连接两个数据帧,sumif 等效

Posted

技术标签:

【中文标题】通过对两个日期之间的值求和来连接两个数据帧,sumif 等效【英文标题】:Joining two dataframes by summing values between two dates, sumif equivalent 【发布时间】:2018-10-20 02:11:20 【问题描述】:

我有两个数据框,df1 和 df2:

import pandas as pd
import datetime
import numpy as np
df1 = pd.DataFrame()
df1["StartDate"] = pd.date_range(start=('2016/01/01'), end = ('2017/12/31'), 
freq="6D")
df1["EndDate"] = df1["StartDate"] + datetime.timedelta(5)
df1["Value_three"] =  pd.Series(np.random.randn(len(df.Date))+2)

df1 有一个开始日期、结束日期和值(名为 value_three)。 df2 有一个日期,value_one 和 value 2。

df2 = pd.DataFrame()
df2["Date"] = pd.date_range(start=('2016/01/01'), end=('2017/12/31'), freq="D")
df2["Value_one"] = pd.Series(np.random.randn(len(df.Date)))
df2["Value_two"] = pd.Series(np.random.randn(len(df.Date))+1)

我想要实现的是类似于 Excel 中的 SUMIFS 功能:

SUMIFS

在这种情况下,我想在 df1 中添加两列,它们分别是 values_1 和 value_2 的总和,其中“日期”列是 df2 在 df1.StartDate 和 df1.EndDate 之间。

假设无法在 Vertica/MSSQL/etc 中预先聚合它。我们也不能使用重新采样,因为开始日期和结束日期可能是不规则的(在这种情况下,间隔 11 天,但间隔可以不断变化)。

我尝试过 join、merge、melt、concat,但我证明失败了!希望有人可以提供帮助。

【问题讨论】:

欢迎来到 SO。请在此处查看如何edit 您的问题更清楚:How to make good reproducible pandas examples。例如,不要使用链接或图片;在您的问题中包含数据作为文本。 谢谢您,我现在将审查并更新。道歉,认为图像将是最简单的方法:) 没问题,主要问题是我们不能将图像复制粘贴到解释器中。所以编写和测试一些代码变得很困难。 【参考方案1】:

这可能不是最有效的,但它确实有效!我也很想了解最有效的方法!

解决方案:

def getForDF1(row):
    row['Value_1'],row['Value_2']= \
    df2[(df2['Date']>=row['StartDate']) & (df2['Date']<=row['EndDate'])].sum()[['Value_1','Value_2']]
    return row 

df1=df1.apply(getForDF1,axis=1)

附:您的代码似乎不起作用,因为 timedelta 不能适用于整个系列。

df1["EndDate"] = df1["StartDate"] + datetime.timedelta(5)

为了使插图更容易,我更改了您的 df 的值:

初始设置:

import pandas as pd

StartDate=['2016-01-01','2016-01-13','2016-01-25','2016-02-06','2016-02-18']
EndDate=['2016-01-12','2016-01-24','2016-01-05','2016-02-17','2016-02-29']
value_3=[1,2,3,4,5]

Date=['2016-01-01','2016-01-02','2016-02-10','2016-02-11','2016-02-18']
value_1=[3,4,5,6,7]
value_2=[0,1,3,5,7]

df1=pd.DataFrame('StartDate':StartDate,'EndDate':EndDate,'Value_3':value_3)
df2=pd.DataFrame('Date':Date,'Value_1':value_1,'Value_2':value_2)

df1['EndDate']=pd.to_datetime(df1['EndDate'])
df1['StartDate']=pd.to_datetime(df1['StartDate'])
df2['Date']=pd.to_datetime(df2['Date'])

【讨论】:

以上是关于通过对两个日期之间的值求和来连接两个数据帧,sumif 等效的主要内容,如果未能解决你的问题,请参考以下文章

我如何在没有重复数据的情况下对两个具有连接的表求和?

如何在没有重复数据的情况下对两个具有连接的表进行求和?

在 R 中:如何在两个日期之间按组对变量求和

如何对位于开始日期和结束日期之间的一组值求和?

python的sum函数怎么用

如果日期介于第二个数据帧中的两个日期之间,则 r 标记第一个数据帧中的行