pd.Timedelta добавляет дополнительный день при расчете разницы между датами - PullRequest
0 голосов
/ 13 октября 2019

У меня есть следующий фрейм данных pandas df:

Actual                  Scheduled
2017-01-01 04:03:00.000 2017-01-01 04:25:00.000
2017-01-01 04:56:00.000 2017-01-01 04:55:00.000
2017-01-01 04:36:00.000 2017-01-01 05:05:00.000
2017-01-01 06:46:00.000 2017-01-01 06:55:00.000
2017-01-01 06:46:00.000 2017-01-01 07:00:00.000

Мне нужно создать дополнительный столбец DIFF_MINUTES, содержащий разницу (в минутах) между Actual и Scheduled (Actual - Scheduled).

Вот как я пытался решить эту задачу:

import pandas as pd
import datetime

df["Actual"] = df.apply(lambda row: datetime.datetime.strptime(str(row["Actual"]),"%Y-%m-%d %H:%M:%S.%f"), axis=1)
df["Scheduled"] = df.apply(lambda row: datetime.datetime.strptime(str(row["Scheduled"]),"%Y-%m-%d %H:%M:%S.%f"), axis=1)
df["DIFF_MINUTES"] = df.apply(lambda row: (pd.Timedelta(row["Actual"]-row["Scheduled"]).seconds)/60, axis=1)

Однако я получил неправильные результаты для случаев с отрицательной разницей (например, 04: 03: 00-04: 25: 00 должно дать 22 минуты вместо 1418 минут):

Actual                      Scheduled              DIFF_MINUTES
2017-01-01 04:03:00         2017-01-01 04:25:00    1418.0
2017-01-01 04:56:00         2017-01-01 04:55:00    1.0
2017-01-01 04:36:00         2017-01-01 05:05:00    1411.0
2017-01-01 06:46:00         2017-01-01 06:55:00    1431.0
2017-01-01 06:46:00         2017-01-01 07:00:00    1426.0

Как это исправить?

Ожидаемый результат:

Actual                      Scheduled              DIFF_MINUTES
2017-01-01 04:03:00         2017-01-01 04:25:00    -22.0
2017-01-01 04:56:00         2017-01-01 04:55:00    1.0
2017-01-01 04:36:00         2017-01-01 05:05:00    -29
2017-01-01 06:46:00         2017-01-01 06:55:00    -9.0
2017-01-01 06:46:00         2017-01-01 07:00:00    -14.0

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Предполагая, что оба столбца имеют значение DateTime , запустите всего:

df['DIFF_MINUTES'] = (df.Actual - df.Scheduled).dt.total_seconds() / 60

(однострочный).

Если вы читаете этот DataFrame, например, из Excel илиCSV-файл, добавьте параметр parse_dates = [0, 1] , чтобы эти столбцы были преобразованы в даты, чтобы не было необходимости приводить их по вашему коду.

И если для некоторыхПо этой причине у вас есть эти столбцы в виде text , чтобы затем преобразовать их, выполните:

df.Actual = pd.to_datetime(df.Actual)
df.Scheduled = pd.to_datetime(df.Scheduled)

(еще более быстрое решение, чем функции "простого Python").

1 голос
/ 13 октября 2019

Используйте dt.total_seconds() как (также проверьте, будет ли дата первой или месяцем в ваших столбцах):

df['Actual']  = pd.to_datetime(df['Actual'], dayfirst=True)
df['Scheduled']  = pd.to_datetime(df['Scheduled'], dayfirst=True)
df['DIFF_MINUTES'] = (df['Actual']-df['Scheduled']).dt.total_seconds()/60

print(df)
               Actual           Scheduled  DIFF_MINUTES
0 2017-01-01 04:03:00 2017-01-01 04:25:00         -22.0
1 2017-01-01 04:56:00 2017-01-01 04:55:00           1.0
2 2017-01-01 04:36:00 2017-01-01 05:05:00         -29.0
3 2017-01-01 06:46:00 2017-01-01 06:55:00          -9.0
4 2017-01-01 06:46:00 2017-01-01 07:00:00         -14.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...