2017-03-01 9 views
1

期間データをPythonのパンダに統合するにはどうすればよいですか?私はパンダの期間データを統合する

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

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 

からのデータを操作したい

私は最後endと新しいstartは最初の1日以内であれば最初にチェックしたいです。そうでない場合は、元のデータ構造を保持していれば元のデータ構造を維持してから統合します。あなたは、各グループが唯一の2行が含まれている場合は使用し10日違いを必要とすることができます

答えて

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

、また、すべてのデータがソートされています

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

関連する問題