在多列时间戳上使用布尔运算符的高效/优雅方式

时间:2017-05-23 16:12:01

标签: python pandas dataframe time boolean

我有一个df结构如下:

rl

我想识别T1和T3之前的时间。如果T2或T3发生在T1之前,那么我想在T2 / T3上加一天。

我遇到的第一个问题是读取一个布尔数组,这将允许我识别T2和T3中哪些记录出现在T1之前。我可以通过以下方式为单个列执行此操作:

    ID    DATE             T1                  T2                 T3
0  1000   5/5/2016  5/5/2016 3:58:54    5/5/2016 4:02:00   5/5/2016 4:15:05
1  1001   5/6/2016  5/5/2016 17:23:39   5/5/2016 17:24:00  5/5/2016 17:44:32
2  1002   5/7/2016  5/5/2016 18:20:50   5/5/2016 18:22:00  5/5/2016 18:37:34
3  1003   5/7/2016  5/5/2016 21:30:29   5/5/2016 21:35:00  5/5/2016 21:45:51
4  1004   5/9/2016  5/5/2016 22:33:19   5/5/2016 22:34:00  5/5/2016 22:41:54

但是,如果我尝试使用多个列执行此操作:

idx = pd.to_datetime(df['T1'])<pd.to_datetime(df['T2'])

给了我以下错误:

idx = pd.to_datetime(df['T1'])<pd.to_datetime(df['T2':])

一旦发现这个问题,我需要在TypeError: cannot do slice indexing on <class 'pandas.indexes.range.RangeIndex'> with these indexers [T2] of <class 'str'> 的时间添加一天,例如:

True

但是,我还没有能够玩这个部分,所以一些帮助将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:2)

IIUC:

df.loc[:, ['T2', 'T3']] = \
    df[['T2', 'T3']].add(
        pd.to_timedelta(((df.T2 < df.T1) | (df.T3 < df.T1)).astype(int), 'd'), 0)