根据基于时间值的if语句创建新列

时间:2018-12-27 02:40:30

标签: python pandas function datetime if-statement

我正在尝试创建一个列,该列给出两个其他列的两个时间戳的方差或相减。

def time_delta(df):
    if df['a_time'] > df['b_time']:
        df = (pd.to_datetime(df.a_time) - pd.to_datetime(df.b_time)) / np.timedelta64(1, 'm')
    else:
        df = (pd.to_datetime(df.b_time) - pd.to_datetime(df.a_time)) / np.timedelta64(1, 'm')
    return df

df['C'] = df.apply(time_delta, axis=1)

当我运行代码的apply部分时,单元格仅以*开头运行,我是否丢失了某些内容?

非常感谢

2 个答案:

答案 0 :(得分:0)

不要将结果分配给“ df”,而是将其更改为其他变量。

def time_delta(df):
    if df['a_time'] > df['b_time']:
        res = (pd.to_datetime(df.a_time) - pd.to_datetime(df.b_time)) / np.timedelta64(1, 'm')
    else:
        res = (pd.to_datetime(df.b_time) - pd.to_datetime(df.a_time)) / np.timedelta64(1, 'm')
    return res

答案 1 :(得分:0)

您的逻辑过于复杂。 pd.DataFrame.apply代表的逐行循环应积极地与熊猫一起避免。在这里,您可以将timedelta系列转换为秒,然后采用绝对值:

df = pd.DataFrame({'a_time': pd.to_datetime(['2018-01-01 05:32:00', '2018-05-10 20:13:41']),
                   'b_time': pd.to_datetime(['2018-01-01 15:10:05', '2018-05-10 16:09:16'])})

df['C'] = (df['b_time'] - df['a_time']).dt.total_seconds().abs() / 60

print(df)

               a_time              b_time           C
0 2018-01-01 05:32:00 2018-01-01 15:10:05  578.083333
1 2018-05-10 20:13:41 2018-05-10 16:09:16  244.416667

出于学术目的,这就是您使用apply的方式:

def time_delta(row):
    if row['a_time'] > row['b_time']:
        return (row['a_time'] - row['b_time']) / np.timedelta64(1, 'm')
    else:
        return (row['b_time'] - row['a_time']) / np.timedelta64(1, 'm')

df['C'] = df.apply(time_delta, axis=1)

注意,在这两个版本中,我们都假定您从datetime系列开始。如果不是这种情况,请确保首先转换为datetime

time_cols = ['a_time', 'b_time']
df[time_cols] = df[time_cols].apply(pd.to_datetime)