2017-04-24 72 views
3

我有兩個數據幀,我需要根據日期值是否適合其他兩個日期之間進行合併。基本上我需要執行一個外部連接,其中B.event_date介於A.start_date和A.end_date之間。似乎合併和加入總是假設一個共同的列,在這種情況下,我沒有。基於兩個其他日期之間沒有公共列的數據幀合併兩個數據幀

A       B 
    start_date end_date  event_date price 
0 2017-03-27 2017-04-20 0 2017-01-20 100 
1 2017-01-10 2017-02-01 1 2017-01-27 200 

Result 
    start_date end_date  event_date price 
0 2017-03-27 2017-04-20 
1 2017-01-10 2017-02-01  2017-01-20 100 
2 2017-01-10 2017-02-01  2017-01-27 200 
+0

將事件曾經在表格中的重疊? – flyingmeatball

+0

不可以。時間序列是不同的。 –

回答

3

創建數據和格式日期時間:

df_A = pd.DataFrame({'start_date':['2017-03-27','2017-01-10'],'end_date':['2017-04-20','2017-02-01']}) 
df_B = pd.DataFrame({'event_date':['2017-01-20','2017-01-27'],'price':[100,200]}) 

df_A['end_date'] = pd.to_datetime(df_A.end_date) 
df_A['start_date'] = pd.to_datetime(df_A.start_date) 
df_B['event_date'] = pd.to_datetime(df_B.event_date) 

創建鍵做交叉聯接:

df_A = df_A.assign(key=1) 
df_B = df_B.assign(key=1) 
df_merge = pd.merge(df_A, df_B, on='key').drop('key',axis=1) 

過濾掉不符合的開始之間的事件日期的條件的記錄和結束日期:

df_merge = df_merge.query('event_date >= start_date and event_date <= end_date') 

加入回到原來的日期範圍表和刪除鍵列

df_out = df_A.merge(df_merge, on=['start_date','end_date'], how='left').fillna('').drop('key', axis=1) 

打印(df_out)

輸出:

   end_date   start_date   event_date price 
0 2017-04-20 00:00:00 2017-03-27 00:00:00       
1 2017-02-01 00:00:00 2017-01-10 00:00:00 2017-01-20 00:00:00 100 
2 2017-02-01 00:00:00 2017-01-10 00:00:00 2017-01-27 00:00:00 200 
+0

這是一個很好的解決方案 - 正是我需要的。由於我沒有足夠的「聲譽」點,我無法對它進行投票。雖然工作很好。 –

+0

這是否適用於大型數據集? – ConanG

+0

沒有這種方法會導致由於此連接引起的笛卡爾產品引起的記錄爆炸。 –