Python 使用开始和结束日期左连接

Python 使用开始和结束日期左连接,python,python-3.x,pandas,Python,Python 3.x,Pandas,前两个表下面是cat1和cat2表 基本上,我希望将cat1加入cat2,其中cat1日期介于cat2的开始/结束日期之间 最后一张表是结果,我应该如何实现这一点 请在下面查找cat1和cat2 将熊猫作为pd导入 起始日期时间导入日期 cat1=pd.DataFrame({ “CatID”:[1,2,3], “日期”:[日期(2019,10,1)、日期(2019,11,1)、日期(2019,12,1)] }) cat2=pd.DataFrame({ “有趣”:[1,2,3], “起始日期”:

前两个表下面是
cat1
cat2
表 基本上,我希望将
cat1
加入
cat2
,其中
cat1
日期介于
cat2
的开始/结束日期之间 最后一张表是结果,我应该如何实现这一点

请在下面查找
cat1
cat2

将熊猫作为pd导入
起始日期时间导入日期
cat1=pd.DataFrame({
“CatID”:[1,2,3],
“日期”:[日期(2019,10,1)、日期(2019,11,1)、日期(2019,12,1)]
})
cat2=pd.DataFrame({
“有趣”:[1,2,3],
“起始日期”:[日期(2019,10,1)、日期(2019,11,1)、日期(2018,10,6)],
“截止日期”:[日期(2019,10,30)、日期(2019,11,30)、日期(2018,10,6)]
})
最简单的方法

import pandas as pd
from datetime import date

cat1=pd.DataFrame({"CatID":[1,2,3],
                 "Date":[date(2019,10,1),date(2019,11,1),date(2019,12,1)]})
cat2=pd.DataFrame({"Interesting":[1,2,3],
                 "StartDate":[date(2019,10,1),date(2019,11,1),date(2018,10,6)],
                  "EndDate":[date(2019,10,30),date(2019,11,30),date(2018,10,6)]})

cat3_data = []
for interesting, start, end in cat2.values:
    for d in pd.date_range(start, end, freq='D'):
        cat3_data.append([d.date(), interesting])
cat3 = pd.DataFrame(cat3_data, columns=['Date', 'Interesting'])

result = pd.merge(cat1, cat3, how='left', on='Date')
结果

    CatID   Date    Interesting
0   1   2019-10-01  1.0
1   2   2019-11-01  2.0
2   3   2019-12-01  NaN
最简单的方法

import pandas as pd
from datetime import date

cat1=pd.DataFrame({"CatID":[1,2,3],
                 "Date":[date(2019,10,1),date(2019,11,1),date(2019,12,1)]})
cat2=pd.DataFrame({"Interesting":[1,2,3],
                 "StartDate":[date(2019,10,1),date(2019,11,1),date(2018,10,6)],
                  "EndDate":[date(2019,10,30),date(2019,11,30),date(2018,10,6)]})

cat3_data = []
for interesting, start, end in cat2.values:
    for d in pd.date_range(start, end, freq='D'):
        cat3_data.append([d.date(), interesting])
cat3 = pd.DataFrame(cat3_data, columns=['Date', 'Interesting'])

result = pd.merge(cat1, cat3, how='left', on='Date')
结果

    CatID   Date    Interesting
0   1   2019-10-01  1.0
1   2   2019-11-01  2.0
2   3   2019-12-01  NaN
将numpy导入为np
作为pd进口熊猫
起始日期时间导入日期
cat1=pd.DataFrame({
“CatID”:[1,2,3],
“日期”:[日期(2019,10,1)、日期(2019,11,1)、日期(2019,12,1)]
})
cat2=pd.DataFrame({
“有趣”:[1,2,3],
“起始日期”:[日期(2019,10,1)、日期(2019,11,1)、日期(2018,10,6)],
“截止日期”:[日期(2019,10,30)、日期(2019,11,30)、日期(2018,10,6)]
})
def get_有趣(x):
val=cat2[(cat2['StartDate']=x)]['Interest']。值
如果len(val)==0:
返回np.nan
其他:
返回值[0]
有趣=cat1['Date']。应用(获取有趣)。重命名('interest')
out=pd.concat([cat1,有趣],轴=1)
输出:

CatID日期
0   1   2019-10-01     1.0
1   2   2019-11-01     2.0
2 3 2019-12-01南
将numpy作为np导入
作为pd进口熊猫
起始日期时间导入日期
cat1=pd.DataFrame({
“CatID”:[1,2,3],
“日期”:[日期(2019,10,1)、日期(2019,11,1)、日期(2019,12,1)]
})
cat2=pd.DataFrame({
“有趣”:[1,2,3],
“起始日期”:[日期(2019,10,1)、日期(2019,11,1)、日期(2018,10,6)],
“截止日期”:[日期(2019,10,30)、日期(2019,11,30)、日期(2018,10,6)]
})
def get_有趣(x):
val=cat2[(cat2['StartDate']=x)]['Interest']。值
如果len(val)==0:
返回np.nan
其他:
返回值[0]
有趣=cat1['Date']。应用(获取有趣)。重命名('interest')
out=pd.concat([cat1,有趣],轴=1)
输出:

CatID日期
0   1   2019-10-01     1.0
1   2   2019-11-01     2.0
2 3 2019-12-01南

如果你不想离开加入,你可以使用这个

import pandas as pd
from datetime import date
import numpy as np
cat1=pd.DataFrame({"CatID":[1,2,3],
                 "Date":[date(2019,10,1),date(2019,11,1),date(2019,12,1)]})
cat2=pd.DataFrame({"Interesting":[1,2,3],
                 "StartDate":[date(2019,10,1),date(2019,11,1),date(2018,10,6)],
                  "EndDate":[date(2019,10,30),date(2019,11,30),date(2018,10,6)]})

cat3 = cat1.copy()
cat3['range'] = cat2.apply(lambda x: pd.date_range(start=x['StartDate'], end=x['EndDate']), axis=1)
cat3['Interesting'] = cat2['Interesting']
cat1['Interesting'] = cat3.apply(lambda x: x['Interesting'] if x['Date'] in x['range'] else np.nan, axis=1)
cat1
输出:

   CatID        Date  Interesting
0      1  2019-10-01          1.0
1      2  2019-11-01          2.0
2      3  2019-12-01          NaN

如果你不想离开加入,你可以用这个

import pandas as pd
from datetime import date
import numpy as np
cat1=pd.DataFrame({"CatID":[1,2,3],
                 "Date":[date(2019,10,1),date(2019,11,1),date(2019,12,1)]})
cat2=pd.DataFrame({"Interesting":[1,2,3],
                 "StartDate":[date(2019,10,1),date(2019,11,1),date(2018,10,6)],
                  "EndDate":[date(2019,10,30),date(2019,11,30),date(2018,10,6)]})

cat3 = cat1.copy()
cat3['range'] = cat2.apply(lambda x: pd.date_range(start=x['StartDate'], end=x['EndDate']), axis=1)
cat3['Interesting'] = cat2['Interesting']
cat1['Interesting'] = cat3.apply(lambda x: x['Interesting'] if x['Date'] in x['range'] else np.nan, axis=1)
cat1
输出:

   CatID        Date  Interesting
0      1  2019-10-01          1.0
1      2  2019-11-01          2.0
2      3  2019-12-01          NaN

如果cat1的
Date
分为两行
StartDate
EndDate
(两行cat2),您需要保留(或全部)有趣的
值是多少。@Himanshu问得好,如果cat1的
日期
分为两行
开始日期
结束日期
(cat2的两行),您需要保留(或全部)有趣的
值是多少?和的可能重复项。@Himanshu好问题,所有内容都将保留