Python 将时间段数据合并到pandas中

Python 将时间段数据合并到pandas中,python,pandas,Python,Pandas,如何在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 到 我想首先检查最后一个结束和新的开始是否在第一天之内。如果不是,则保留原始数据结构,如果是,则合并 如果每个组仅包含2行,并且需要差异1和0天,则可以使用,并且所有数据

如何在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


我想首先检查最后一个
结束
和新的
开始
是否在第一天之内。如果不是,则保留原始数据结构,如果是,则合并

如果每个组仅包含
2
行,并且需要差异
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)
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

如果每个组仅包含
2
行,并且需要差异
1
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

前面的答案也是正确的。但这可以处理多个拼接的更一般情况。前面的答案也是正确的。但这可以处理多个拼接的更一般情况。