Как получить разницу между двумя записями одного дня? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть следующие панды DataFrame:

import pandas as pd
df = pd.DataFrame({"datetime": ["30.12.1999 00:59:00", "30.12.1999 23:59:00", "31.12.1999 00:59:00", "31.12.1999 23:59:00"], "b": [4, 15, 26,7]})
df["datetime"] = pd.to_datetime(df.datetime)
df["date"]=df.datetime.dt.date

, который выглядит следующим образом:

             datetime   b        date
0 1999-12-30 00:59:00   4  1999-12-30
1 1999-12-30 23:59:00  15  1999-12-30
2 1999-12-31 00:59:00  26  1999-12-31
3 1999-12-31 23:59:00   7  1999-12-31

В кадре данных в действительности гораздо больше строк, но по-прежнему действует следующий принцип: выесть только две строки за один день.

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

        date  b_delta
0 1999-12-30       11
1 1999-12-31      -19

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Самый простой способ сделать это будет:

df.set_index('date').groupby('date')['b'].diff().reset_index(name='b_delta').dropna()

Вывод:

date           b_delta
1999-12-30     11.0
1999-12-31    -19.0
0 голосов
/ 30 ноября 2018

Я бы установил индекс на date, сгруппировав его и использовав diff в столбце b, чтобы вычесть последовательные значения.Затем вы можете выбрать только ненулевые значения:

g = df.set_index('date').groupby(level=0).b.diff()
g[g.notnull()]

date
1999-12-30    11.0
1999-12-31   -19.0
Name: b, dtype: float64

Вы можете установить его на фрейм данных с желаемым заголовком b_delta, например:

>>> g[g.notnull()].to_frame('b_delta')
            b_delta
date               
1999-12-30     11.0
1999-12-31    -19.0

Редактировать : я пропустил использование dropna, что действительно является подходом (как в отличном ответе @ AbhinavSood, который, честно говоря, должен быть принятым ответом ...):

df.set_index('date').groupby(level=0).b.diff().dropna().to_frame('b_delta')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...