Pandas разница между временными метками в строке на уровне столбца - PullRequest
0 голосов
/ 04 марта 2020

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

                  Date  Type
0  1990-01-01 02:00:00   1
1  1990-01-01 03:00:00   1
2  1990-01-01 04:00:00   1
3  1990-01-01 05:00:00   2
4  1990-01-01 06:00:00   2
5  1990-01-01 07:00:00   2

Как получить разницу во времени для строки в новом столбце df ['dt'] в секундах в пределах уровня столбца df ['time']? Следующее работает (но не на уровне столбца):

df['dt'] = (df['Date'] - df['Date'].shift(1)).astype('timedelta64[s]')

Как мне заставить это работать на уровне столбца? В идеале начало нового типа должно иметь нулевую разницу во времени.

1 Ответ

1 голос
/ 04 марта 2020

Для решения с shift вычитать значения на Series.sub со смещенными данными по группам на DataFrameGroupBy.shift, заменить пропущенные значения на 0 Timedeta и использовать в последний раз Series.dt.total_seconds:

df = pd.DataFrame() 
df['HH'] = np.arange(0,10) 
start_date ='1990-01-01 00:00:00' 
df['Date'] = pd.to_datetime(df['HH'], unit='h', origin=start_date) 
df['Type'] = [1,1,1,1,1,2,2,2,2,2]

s = df.groupby("Type")['Date'].shift()
df['dt2'] = df['Date'].sub(s).fillna(pd.Timedelta(0)).dt.total_seconds()
print (df)
   HH                Date  Type     dt2
0   0 1990-01-01 00:00:00     1     0.0
1   1 1990-01-01 01:00:00     1  3600.0
2   2 1990-01-01 02:00:00     1  3600.0
3   3 1990-01-01 03:00:00     1  3600.0
4   4 1990-01-01 04:00:00     1  3600.0
5   5 1990-01-01 05:00:00     2     0.0
6   6 1990-01-01 06:00:00     2  3600.0
7   7 1990-01-01 07:00:00     2  3600.0
8   8 1990-01-01 08:00:00     2  3600.0
9   9 1990-01-01 09:00:00     2  3600.0

Другая идея с DataFrameGroupBy.diff:

df['dt2'] = df.groupby("Type")['Date'].diff().fillna(pd.Timedelta(0)).dt.total_seconds()
...