Создание нового столбца на основе значения времени на основе оператора if - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь создать столбец, который дает дисперсию или вычитание двух временных меток двух других столбцов.

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)

Когда я запускаю часть применения кода, с которой ячейка просто продолжает работать *, я что-то упускаю?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Ваша логика слишком сложна.Рядовые петли, которые представляют собой 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)
0 голосов
/ 27 декабря 2018

Не присваивайте результат "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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...