Рассчитать разницу во времени между строками в Python - PullRequest
0 голосов
/ 30 июня 2019

Попытка вычислить разницу во времени между строками, если применяются несколько условий:

df['open_time'] = pd.to_datetime(df['open_time'], errors='coerce')
df['Time_diff'] = pd.to_datetime(df['Time_diff'], errors='coerce')

for i in range(1, len(df)):
if df.loc[i, 'JOB_ID'] == df.loc[i-1, 'JOB_ID'] and df.loc[i, 'STATION_IDX'] > df.loc[i-1, 'STATION_IDX']:
    df['Time_diff'] = df.loc[i, 'open_time'] - df.loc[i-1, 'open_time']

open_time - это простое время дня ЧЧ: мм: сс, когда выполнялось действие, вот и все ...

Исходный набор данных:

JOB_ID  DDMMYY  STATION_IDX open_time
121663240   04-02-19    25  5:02:19
121663240   04-02-19    26  5:04:00
121663240   04-02-19    27  5:04:42
121651974   04-02-19    25  6:08:15
121651974   04-02-19    27  6:10:28

Я не могу понять, почему я продолжаю получать 'NaT' для всех строк Time_diff

       JOB_ID Time_diff
0   121663240       NaT
1   121663240       NaT
2   121663240       NaT
3   121651974       NaT
4   121651974       NaT
5   121682840       NaT
6   121682840       NaT

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

Ожидаемый результат, который я надеюсь получить для указанного набора данных:

JOB_ID ddmmyy   25 to 26    26 to 27    25 to 27
121663240   04-02-2019  101 42  143
121651974   04-02-2019  NaN NaN 133

1 Ответ

0 голосов
/ 01 июля 2019

Таким образом, вы просто хотите, чтобы новый столбец (Time_diff) содержал разницу столбца open_time между последовательными строками, если JOB_ID имеет одинаковое значение для этих 2 строк, и STATION_IDX увеличивается.

В пандах вы должны стараться избегать явных циклов, потому что это не тот способ, которым оптимизируется панда. Вот что вы, вероятно, хотите:

# first build a mask for rows having same JOB_ID and STATION_IDX as previous one
mask = (df.JOB_ID==df.JOB_ID.shift())&(df.STATION_IDX>df.STATION_IDX.shift())
# then compute the difference
df.loc[mask,'Time_diff'] = df.loc[mask, 'open_time'] - df.shift().loc[mask, 'open_time']

С вашими данными выборки это дает:

      JOB_ID    DDMMYY  STATION_IDX           open_time Time_diff
0  121663240  04-02-19           25 2019-07-01 05:02:19       NaT
1  121663240  04-02-19           26 2019-07-01 05:04:00  00:01:41
2  121663240  04-02-19           27 2019-07-01 05:04:42  00:00:42
3  121651974  04-02-19           25 2019-07-01 06:08:15       NaT
4  121651974  04-02-19           27 2019-07-01 06:10:28  00:02:13
...