Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过两个日期之间的值求和连接两个数据帧,sumif等效_Python_Pandas_Date_Dataframe_Merge - Fatal编程技术网

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

Python 通过两个日期之间的值求和连接两个数据帧,sumif等效,python,pandas,date,dataframe,merge,Python,Pandas,Date,Dataframe,Merge,我有两个数据帧,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

我有两个数据帧,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_三)。df2有一个日期、值1和值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函数:

在本例中,我想向df1添加两列,分别是值_1和值_2,其中“日期”列为df2,位于df1.StartDate和df1.EndDate之间

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


我试过加入,合并,融化,浓缩,但我证明了失败!希望有人能帮忙。

这可能不是最有效的,但它很有效!我也很想知道最有效的方法

解决方案:

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)
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'])

欢迎来到SO。请查看此处,了解如何使您的问题更清楚:。例如,不要使用链接或图像;在你的问题中以文本形式包含数据。谢谢,我现在就复习并更新。抱歉,我认为图像是最简单的方法:)没问题,主要问题是我们不能将粘贴图像复制到解释器中。因此,编写和测试一些代码变得很困难。