Исправление Pandas совокупной суммы в столбце Timedelta - PullRequest
1 голос
/ 07 мая 2020

Сейчас у меня есть строка кода, которую я использую, чтобы попытаться создать столбец, основанный на совокупной сумме данных timedelta между датами. Как бы то ни было, он не всегда правильно выполняет кумулятивную сумму, и я также получил предупреждение, что моя строка кода python не будет работать в будущем.

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

ID       CREATION_DATE             TIMEDIFF              EDITNUMB       
8211    11/26/2019 13:00                                    1        
8211    1/3/2020 9:11      37 days 20:11:09.000000000       1       
8211    2/3/2020 14:52     31 days 05:40:57.000000000       1       
8211    3/27/2020 15:00    53 days 00:07:49.000000000       1       
8211    4/29/2020 12:07    32 days 21:07:23.000000000       1

Вот моя строка кода python:

df['RECUR'] = df.groupby(['ID']).TIMEDIFF.apply(lambda x: x.shift().fillna(1).cumsum())

В результате получается новый столбец «RECUR», который не суммирует кумулятивно правильно данные в столбце «TIMEDIFF»:

ID       CREATION_DATE             TIMEDIFF              EDITNUMB          RECUR
8211    11/26/2019 13:00                                    1       0 days 00:00:01.000000000
8211    1/3/2020 9:11      37 days 20:11:09.000000000       1       0 days 00:00:02.000000000
8211    2/3/2020 14:52     31 days 05:40:57.000000000       1       37 days 20:11:11.000000000
8211    3/27/2020 15:00    53 days 00:07:49.000000000       1       69 days 01:52:08.000000000
8211    4/29/2020 12:07    32 days 21:07:23.000000000       1       122 days 01:59:57.000000000

Что также вызывает это предупреждение:

FutureWarning: Passing integers to fillna is deprecated, will raise a TypeError in a future version.  To retain the old behavior, pass pd.Timedelta(seconds=n) instead.

Любая помощь по этому поводу будет принята с благодарностью, общая сумма должна составлять 153 дня, начиная с 26.11.19, и правильно отображаться кумулятивно в Столбец RECUR.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Вы можете fillna с timedelta 0 секунд и выполнить cumsum

df['RECUR'] = df.groupby('ID').TIMEDIFF.apply(
    lambda x: x.fillna(pd.Timedelta(seconds=0)).cumsum())

df['RECUR']
# 0 0 days 00:00:00
# 1 37 days 20:11:09
# 2 69 days 01:52:06
# 3 122 days 01:59:55
# 4 154 days 23:07:18
1 голос
/ 07 мая 2020

IIU C, вы можете сделать:

# transform('first') would also work
df['RECUR'] = df['CREATION_DATE'] - df.groupby('ID').CREATION_DATE.transform('min')

Вывод:

     ID       CREATION_DATE         TIMEDIFF  EDITNUMB             RECUR
0  8211 2019-11-26 13:00:00              NaT         1   0 days 00:00:00
1  8211 2020-01-03 09:11:00 37 days 20:11:00         1  37 days 20:11:00
2  8211 2020-02-03 14:52:00 31 days 05:41:00         1  69 days 01:52:00
3  8211 2020-03-27 15:00:00 53 days 00:08:00         1 122 days 02:00:00
4  8211 2020-04-29 12:07:00 32 days 21:07:00         1 154 days 23:07:00
...