2017-04-24 2 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

이벤트가 지금까지 테이블 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

이 방법으로 인해이 결합으로 인해 데카르트 제품으로 인해 레코드가 폭발하게됩니다. –

관련 문제