2017-05-02 46 views
2

我有兩個數據幀,我想基於時間Concat的它們例如範圍 如何根據時間來Concat的2大熊貓數據幀範圍

數據幀甲

user timestamp product 
A  2015/3/13  1 
B  2015/3/15  2 

數據幀乙

user  time  behavior 
    A  2015/3/1  2 
    A  2015/3/8  3 
    A  2015/3/13  1 
    B  2015/3/1  2 

我想連接2數據幀如下(幀B左連接到幀A) 列「timestamp1」是7天前列「時間戳」 例如當時間戳爲3/13,則3/6-13的範圍是從 否則不CONCAT

user timestamp product  time1  behavior 
A  2015/3/13  1   2015/3/8  3 
A  2015/3/13  1   2015/3/13  1 
B  2015/3/15  2   NaN   NaN 

的SQL代碼看起來像

select * from 
B left join A 
on user 
where B.time >= A.timestamp - 7 & B.time <= A.timestamp 

##WHERE B.time BETWEEN DATE_SUB(B.time, INTERVAL 7 DAY) AND A.timestamp ; 

我們如何使該上蟒蛇?

只能想到以下的和不知道如何與時間工作..

new = pd.merge(A, B, on='user', how='left') 

感謝和抱歉..

+0

您的時間/時間戳記字段的格式設置爲pandas datetime嗎? –

+0

你想落於今年同一週要加入或在列「時間戳」總是在這個意義上的基準日期,即它們確定了幾個星期的終點行? – Falcon9

回答

2

解決這個 -

from datetime import timedelta 
所需的幾個步驟

首先,將您的時間戳轉換爲pandas datetime。 (DF1指的是數據幀A和DF2指的是數據幀B)

df1[['time']]=df1[['timestamp']].apply(pd.to_datetime) 
df2[['time']]=df2[['time']].apply(pd.to_datetime) 

合併如下:(根據您的最終數據集,我認爲你的左連接更多的是右連接)

df3 = pd.merge(df1,df2,how='left') 

獲取您的最終df:

df4 = df3[(df3.time>=df3.timestamp-timedelta(days=7)) & (df3.time<=df3.timestamp)] 

包含nan的行缺失,這是因爲有條件連接在熊貓中完成的方式。

條件連接並不是大熊貓的一個功能。通過過濾後發送連接的一種方法是通過。

+0

非常感謝這個作品非常好 –

+0

如果它解決了你的問題,請不要忘記接受答案:) – Satyadev

0

這裏有一個解決方案,它依賴於兩個合併 - 第一,來縮小dataframe Bdf2),然後,以產生所需的輸出:

我們所用的示例讀dataframes與read_clipboard()

import pandas as pd 

# copy dataframe A data, then: 
df1 = pd.read_clipboard(parse_dates=['timestamp']) 

# copy dataframe B data, then: 
df2 = pd.read_clipboard(parse_dates=['time']) 

合併和過濾器:

# left merge df2, df1 
tmp = df2.merge(df1, on='user', how='left') 

# then drop rows which disqualify based on timestamp 
mask = tmp.time < (tmp.timestamp - pd.Timedelta(days=7)) 
tmp.loc[mask, ['time', 'behavior']] = None 
tmp = tmp.dropna(subset=['time']).drop(['timestamp','product'], axis=1) 

# now perform final merge 
merged = df1.merge(tmp, on='user', how='left') 

輸出:

user timestamp product  time behavior 
0 A 2015-03-13  1 2015-03-08  3.0 
1 A 2015-03-13  1 2015-03-13  1.0 
2 B 2015-03-15  2  NaT  NaN