Вычесть значение времени из столбца раз в Pandas

У меня есть колонка времени, как так

df = pd.DataFrame({'times':['10:59:20.1647', '11:05:46.2258', '11:10:59.4658']})

моя цель состоит в том, чтобы вычесть все это время в первый раз. Для этого я преобразовал столбец в тип datetime.time и вычел первое значение из всего столбца:

pd.to_datetime(df['times']).dt.time - pd.to_datetime(df['times']).dt.time.iloc[0]

Однако при этом я получаю сообщение об ошибке:

TypeError: unsupported operand type(s) for -: 'datetime.time' and'datetime.time'

Не могли бы вы предложить умный и элегантный способ для достижения моей цели?


person Federico Gentile    schedule 12.10.2017    source источник


Ответы (1)


Используйте 1_:

a = pd.to_timedelta(df['times'])
b =  a - a.iat[0]
print (b)
0          00:00:00
1   00:06:26.061100
2   00:11:39.301100
Name: times, dtype: timedelta64[ns]

И если нужно раз:

c = pd.to_datetime(b).dt.time
print (c)
0           00:00:00
1    00:06:26.061100
2    00:11:39.301100
Name: times, dtype: object

print (c.apply(type))
0    <class 'datetime.time'>
1    <class 'datetime.time'>
2    <class 'datetime.time'>
Name: times, dtype: object

Другое решение с выходом timedelta:

a = pd.to_datetime(df['times'])
b =  a - a.iat[0]
print (b)
0          00:00:00
1   00:06:26.061100
2   00:11:39.301100
Name: times, dtype: timedelta64[ns]
person jezrael    schedule 12.10.2017
comment
И последнее: скажем, я хочу округлить секунды на основе десятичных знаков, что мне делать? Заранее спасибо :) - person Federico Gentile; 12.10.2017
comment
Так какой же желаемый результат от 00:06:26.061100 ? - person jezrael; 12.10.2017
comment
00:06:26.061100 будет 00:06:26 / 00:06:28.510000 будет 00:06:28 - person Federico Gentile; 12.10.2017
comment
Вы можете использовать print (b.dt.round('S')), но, как вы думаете, это немного отличается - проверьте это для объяснения. - person jezrael; 12.10.2017