Изменение типа столбца с датой формата ('Aug 12 2023 09: +0') pd.DataFrame

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

Есть DataFrame в котором один столбец представлен в строковом виде типа 'Aug 12 2023 09: +0', мне необходимо преобразовать в datetime64.

введите сюда описание изображения

Подскажите, пожалуйста, как перевести данный столбец в datetime64, можно так-же вариант где обрезается часовой пояс +0. Пробую следующем образом:

test_list = [['Aug 12 2023 11: +0'],['Jul 30 2023 18: +0'],['Apr 10 2023 01: +0']]

df = pd.DataFrame( data=test_list, index=None, columns=['Data'])

df['Data'] = pd.to_datetime(df['Data'].str[:-4], format='%m %d %Y %H')

ПОЛУЧАЮ ОШИБКУ:

ValueError: time data 'Aug 12 2023 11' does not match format '%m %d %Y %H' (match)

Ответы

▲ 0Принят

В вашем варианте решения не полностью и не вполне корректно определен шаблон. Исходя из документации, шаблон можно написать так: %b %d %Y %H: +0, таймзону можно не откусывать (если она всегда +0).

df['Data1'] = pd.to_datetime(df.Data, format='%b %d %Y %H: +0')
print(df, f'\nТип данных: {df.Data1.dtypes}')
                 Data               Data1
0  Aug 12 2023 11: +0 2023-08-12 11:00:00
1  Jul 30 2023 18: +0 2023-07-30 18:00:00
2  Apr 10 2023 01: +0 2023-04-10 01:00:00 
Тип данных: datetime64[ns]

Есть вариант с "откусыванием" таймзоны без применения шаблона:

df['Data1'] = df.Data.str[:-4].astype('datetime64[ns]')
print(df, f'\nТип данных: {df.Data1.dtypes}')
                 Data               Data1
0  Aug 12 2023 11: +0 2023-08-12 11:00:00
1  Jul 30 2023 18: +0 2023-07-30 18:00:00
2  Apr 10 2023 01: +0 2023-04-10 01:00:00 
Тип данных: datetime64[ns]

Но первый вариант более точный и правильный, на мой взгляд

Дополнение. Если таймзона может быть +/- и с разным кол-вом знаков, то можно разрезать строку по двоеточию и дальше отработать по шаблону с первой частью строки:

test_list = [['Aug 12 2023 11: -0005'], ['Jul 30 2023 18: +3'], ['Apr 10 2023 01: +12']]
df = pd.DataFrame(data=test_list, index=None, columns=['Data'])

df['Data1'] = pd.to_datetime(df.Data.str.split(':', expand=True)[0], format='%b %d %Y %H')
print(df, f'\nТип данных: {df.Data1.dtypes}')
                    Data               Data1
0  Aug 12 2023 11: -0005 2023-08-12 11:00:00
1     Jul 30 2023 18: +3 2023-07-30 18:00:00
2    Apr 10 2023 01: +12 2023-04-10 01:00:00 
Тип данных: datetime64[ns]