Преобразование timedelta64 [ns] в секундах в Python Pandas DataFrame
A pandas Столбец DataFrame duration
содержит timedelta64[ns]
, как показано. Как вы можете преобразовать их в секундах?
0 00:20:32
1 00:23:10
2 00:24:55
3 00:13:17
4 00:18:52
Name: duration, dtype: timedelta64[ns]
Я попробовал следующее
print df[:5]['duration'] / np.timedelta64(1, 's')
но получил ошибку
Traceback (most recent call last):
File "test.py", line 16, in <module>
print df[0:5]['duration'] / np.timedelta64(1, 's')
File "C:\Python27\lib\site-packages\pandas\core\series.py", line 130, in wrapper
"addition and subtraction, but the operator [%s] was passed" % name)
TypeError: can only operate on a timedeltas for addition and subtraction, but the operator [__div__] was passed
Также попробовал
print df[:5]['duration'].astype('timedelta64[s]')
но получил ошибку
Traceback (most recent call last):
File "test.py", line 17, in <module>
print df[:5]['duration'].astype('timedelta64[s]')
File "C:\Python27\lib\site-packages\pandas\core\series.py", line 934, in astype
values = com._astype_nansafe(self.values, dtype)
File "C:\Python27\lib\site-packages\pandas\core\common.py", line 1653, in _astype_nansafe
raise TypeError("cannot astype a timedelta from [%s] to [%s]" % (arr.dtype,dtype))
TypeError: cannot astype a timedelta from [timedelta64[ns]] to [timedelta64[s]]
Ответы
Ответ 1
Это правильно работает в текущей версии Pandas (версия 0.14):
В [132]: df [: 5] ['duration']/np.timedelta64 (1, s ')
Из [132]:
0 1232
1 1390
2 1495
3 797
4 1132
Имя: продолжительность, dtype: float64
Код>
Ниже приведено обходное решение для более старых версий Pandas/NumPy:
В [131]: df [: 5] ['duration']. values.view('< i8')/10 ** 9
Out [131]: массив ([1232, 1390, 1495, 797, 1132], dtype = int64)
Код>
timedelta64 и данные datetime64 хранятся внутри как 8-байтовые ints (dtype
<Код > '< i8'код > ). Таким образом, приведенное выше представление timedelta64s как 8-байтовых int и затем целое число
деление для преобразования наносекунд в секунды.
Обратите внимание, что вы нужна NumPy версия 1.7 или более новая для работы с datetime64/timedelta64s.
Ответ 2
Просто понял, что это старая нить, так или иначе оставив ее здесь, если странники как я нажимаю только на 5 лучших результатов в поисковой системе и заканчивает здесь.
Убедитесь, что ваши типы верны.
-
Если вы хотите преобразовать datetime в секунды, просто суммируйте секунды за каждый час, минуту и секунды объекта datetime, если его продолжительность в течение одного дата.
-
- часы - часы x 3600 = секунды
-
- минуты - минуты x 60 = секунды
-
linear_df['duration'].dt.hour*3600 + linear_df['duration'].dt.minute*60 + linear_df['duration'].dt.second
- Если вы хотите преобразовать timedeltastrong > в секунды, используйте один ниже.
linear_df[:5]['duration'].astype('timedelta64[s]')
У меня это получилось так:
Столбцы start_dt и end_dt находятся в этом формате:
import datetime
linear_df[:5]['start_dt']
0 1970-02-22 21:32:48.000
1 2016-12-30 17:47:33.216
2 2016-12-31 09:33:27.931
3 2016-12-31 09:52:53.486
4 2016-12-31 10:29:44.611
Name: start_dt, dtype: datetime64[ns]
Была моя продолжительность в формате timedelta64 [ns], который был вычитанием значений start и end datetime.
linear_df['duration'] = linear_df['end_dt'] - linear_df['start_dt']
Получаемый столбец продолжительности выглядит следующим образом
linear_df[:5]['duration']
0 0 days 00:00:14
1 2 days 17:44:50.558000
2 0 days 15:37:28.418000
3 0 days 18:45:45.727000
4 0 days 19:21:27.159000
Name: duration, dtype: timedelta64[ns]
Используя pandas, у меня была длительность секунд между двумя датами в float. Легче сравнить или отфильтровать свою продолжительность позже.
linear_df[:5]['duration'].astype('timedelta64[s]')
0 14.0
1 236690.0
2 56248.0
3 67545.0
4 69687.0
Name: duration, dtype: float64
В моем случае, если я хочу получить всю продолжительность, которая составляет более 1 секунды.
Надеюсь, это поможет.
Ответ 3
Мы можем просто использовать функцию pandas apply()
def get_seconds(time_delta):
return time_delta.seconds
def get_microseconds(time_delta):
return time_delta.micro_seconds
time_delta_series = df['duration']
converted_series = time_delta_series.apply(get_seconds)
print(converted_series)