Панды: извлечь час из таймделты
Этот ответ объясняет, как преобразовать целые числа в часовые шаги в Пандах. Мне нужно сделать наоборот.
Мой фрейм данных df1
:
A
0 02:00:00
1 01:00:00
2 02:00:00
3 03:00:00
Мой ожидаемый фрейм данных df1
:
A B
0 02:00:00 2
1 01:00:00 1
2 02:00:00 2
3 03:00:00 3
Что я пытаюсь:
df1['B'] = df1['A'].astype(int)
Это не удается, потому что:TypeError: cannot astype a timedelta from [timedelta64[ns]] to [int32]
Каков наилучший способ сделать это?
РЕДАКТИРОВАТЬ
Если я попробую df['B'] = df['A'].dt.hour
тогда я получаю:AttributeError: 'TimedeltaProperties' object has no attribute 'hour'
4 ответа
Ты можешь использовать dt.components
и получить доступ к столбцу часов:
In[7]:
df['B'] = df['A'].dt.components['hours']
df
Out[7]:
A B
0 02:00:00 2
1 01:00:00 1
2 02:00:00 2
3 03:00:00 3
компоненты timedelta возвращают каждый компонент в виде столбца:
In[8]:
df['A'].dt.components
Out[8]:
days hours minutes seconds milliseconds microseconds nanoseconds
0 0 2 0 0 0 0 0
1 0 1 0 0 0 0 0
2 0 2 0 0 0 0 0
3 0 3 0 0 0 0 0
Поделить на np.timedelta64(1, 'h')
:
df1['B'] = df1['A'] / np.timedelta64(1, 'h')
print (df1)
A B
0 02:00:00 2.0
1 01:00:00 1.0
2 02:00:00 2.0
3 03:00:00 3.0
Оба решения - dt.components или np.timedelta64 - полезны. Просто np.timedelta64 намного быстрее, чем dt.components (это полезно знать, особенно для больших фреймов данных):
import pandas as pd
import numpy as np
dct = {
'date1': ['08:05:23', '18:07:20', '08:05:23'],
'date2': ['09:15:24', '22:07:20', '08:54:01']
}
df = pd.DataFrame(dct)
df['date1'] = pd.to_datetime(df['date1'], format='%H:%M:%S')
df['date2'] = pd.to_datetime(df['date2'], format='%H:%M:%S')
df['delta'] = df['date2']-df['date1']
%timeit df['np_h'] = (df['delta'] / np.timedelta64(1,'h')).astype(int)
%timeit df['td_h'] = df['delta'].dt.components['hours']
Output:
1000 loops, best of 3: 484 µs per loop
1000 loops, best of 3: 1.43 ms per loop
И, как заметил @EdChum, dt.components['hours']
возвращает только значение часов < 24, что на самом деле не является проблемой в случае этого вопроса. Но для полных дат, где дельта> 24 часа dt.components['days']*24+dt.components['hours']
должен использоваться (что удваивает время обработки).
В качестве альтернативы разделить на
pd.Timedelta(1, 'h')
:
df1['B'] = df1['A'] / pd.Timedelta(1, 'h')
Результат плавающий.
https://pandas.pydata.org/docs/reference/api/pandas.Timedelta.html