2017-04-24 5 views
3

私は、日付値が他の2つの日付の間に収まるかどうかに基づいてマージする必要がある2つのデータフレームを持っています。基本的には、B.event_dateがA.start_dateとA.end_dateの間にある外部結合を実行する必要があります。マージと結合は、常にこの場合、私は持っていない一般的な列を想定しているようです。共通の列を持たない他の2つの日付間の日付に基づいて2つのデータフレームをマージする

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

イベントが今まで表Aに重複するのでしょうか? – 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

この方法では、この結合によってデカルト積に起因するレコードの爆発が発生することはありません。 –

関連する問題