Как преобразовать type: "object" в "datatime" в Pandas?

Рейтинг: 0Ответов: 1Опубликовано: 27.03.2023

Когда пытаюсь преобразовать type: "object" в "datatime" получаю ошибку

import pandas as pd
import openpyxl

df = pd.read_excel('SLA.xlsx')

df['Время выполнения заявки по SLA (ч:м:с)'] = pd.to_datetime(df['Время выполнения 
заявки по SLA (ч:м:с)'])

вывод:

Traceback (most recent call last):
File "c:\Users\fram6\Desktop\excel\sla.py", line 14, in <module>
df['Время выполнения заявки по SLA (ч:м:с)'] = pd.to_datetime(df['Время выполнения 
заявки по SLA (ч:м:с)'])
                                               
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\fram6\Desktop\excel\venv\Lib\site- 
packages\pandas\core\tools\datetimes.py", line 1068, in to_datetime
values = convert_listlike(arg._values, format)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\fram6\Desktop\excel\venv\Lib\site- 
packages\pandas\core\tools\datetimes.py", line 438, in _convert_listlike_datetimes
result, tz_parsed = objects_to_datetime64ns(
                    ^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\fram6\Desktop\excel\venv\Lib\site- 
packages\pandas\core\arrays\datetimes.py", line 2177, in objects_to_datetime64ns
result, tz_parsed = tslib.array_to_datetime(
                    ^^^^^^^^^^^^^^^^^^^^^^^^
File "pandas\_libs\tslib.pyx", line 427, in pandas._libs.tslib.array_to_datetime
File "pandas\_libs\tslib.pyx", line 683, in pandas._libs.tslib.array_to_datetime
File "pandas\_libs\tslib.pyx", line 833, in pandas._libs.tslib._array_to_datetime_object
File "pandas\_libs\tslib.pyx", line 655, in pandas._libs.tslib.array_to_datetime
TypeError: <class 'datetime.time'> is not convertible to datetime

В попытках найти решение, испробовал разные варианты и пришел к тому, что в в файле .xlsx в столбце 'Время выполнения заявки по SLA (ч:м:с)' используются разные форматы времени, на рисунке 1 показан столбец из файла .xlsx

Рис.1

пробовал использовать format

df['Время выполнения заявки по SLA (ч:м:с)'] = pd.to_datetime(df['Время выполнения 
заявки по SLA (ч:м:с)'], format='%H:%M:%S')

Вывод:

ValueError: time data '1900-01-01 01:44:03' does not match format '%H:%M:%S' (match)

При изменение формата на %Y:%m:%d %H:%M:%S выдает ошибку, ссылась на уже другие ячейки таблицы ValueError: time data '00:08:24' does not match format '%Y:%m:%d %H:%M:%S' (match)

Как можно преобразовать сразу все данные в нужный тип?

Ответы

▲ 1Принят

Не логично преобразовывать время выполнения в datetime. Время выполнения логично преобразовывать в timedelta. В любом случае, я бы рекомендовал перевести сначала все в секунды, а потом реобразовывать.

Предположим, у вас есть датафрейм:

import pandas as pd

a=["0:10:12", "10:15:48", "150:18:20"]
df = pd.DataFrame(a)
           0
0    0:10:12
1   10:15:48
2  150:18:20

Преобразовываем object сначала в секунды, а потом в timedelta:

df[0] = pd.to_timedelta(df[0].str.findall(
    "(\d+)").apply(lambda x: int(x[0])*3600 + int(x[1])*60 + int(x[2])), unit="s")

получаем:

                0
0 0 days 00:10:12
1 0 days 10:15:48
2 6 days 06:18:20

Если уж прям хочется в datetime:

df[0] = pd.to_datetime(df[0].str.findall(
    "(\d+)").apply(lambda x: int(x[0])*3600 + int(x[1])*60 + int(x[2])), unit="s")

Получите:

                    0
0 1970-01-01 00:10:12
1 1970-01-01 10:15:48
2 1970-01-07 06:18:20