2017-03-01 14 views
1

如何合併Python熊貓中的時間段數據?合併大熊貓的時間段數據

我想從

person start  end 
1  2001-1-8 2002-2-14 
1  2002-2-14 2003-3-1 
2  2001-1-5 2002-2-16 
2  2002-2-17 2003-3-9 

操縱數據

person start  end 
1  2001-1-8 2002-3-1 
2  2001-1-5 2002-3-9 

我首先要檢查,如果最後end和新start是1天之內第一次。如果不是,則保留原始數據結構,如果是,則合併。

回答

0
df.sort_values(["person", "start", "end"], inplace=True) 

def condense(df): 
    df['prev_end'] = df["end"].shift(1) 
    df['dont_condense'] = (abs(df['prev_end'] - df['start']) > timedelta(days=1)) 
    df["group"] = df['dont_condense'].fillna(False).cumsum() 
    return df.groupby("group").apply(lambda x: pd.Series({"person": x.iloc[0].person, 
               "start": x.iloc[0].start, 
               "end": x.iloc[-1].end})) 

df.groupby("person").apply(condense).reset_index(drop=True) 
+0

以前的答案也是正確的。但是這處理更多一般情況下的多個拼接。 – pynoob

0

如果每個組只包含2行可以使用,需要區別10天,也是所有數據進行排序:

print (df) 
    person  start  end 
0  1 2001-1-8 2002-2-14 
1  1 2002-2-14 2003-3-1 
2  2 2001-1-5 2002-2-16 
3  2 2002-2-17 2003-3-9 
4  3 2001-1-2 2002-2-14 
5  3 2002-2-17 2003-3-10 

df.start = pd.to_datetime(df.start) 
df.end = pd.to_datetime(df.end) 

def f(x): 
    #if need difference only 0 days, use 
    #a = (x['start'] - x['end'].shift()) == pd.Timedelta(days=0) 
    a = (x['start'] - x['end'].shift()).isin([pd.Timedelta(days=1), pd.Timedelta(days=0)]) 
    if a.any(): 
     x.end = x['end'].shift(-1) 
    return (x) 

df1 = df.groupby('person').apply(f).dropna().reset_index(drop=True) 
print (df1) 
    person  start  end 
0  1 2001-01-08 2003-03-01 
1  2 2001-01-05 2003-03-09 
2  3 2001-01-02 2002-02-14 
3  3 2002-02-17 2003-03-10 
+0

非常優雅的使用dropna,謝謝。 – pynoob