Строка даты и времени с пробелом, локальная дата

Я пытаюсь преобразовать строку даты и времени (немецкий), полученную из MS Project Excel Export.

02 февраля 2022 17:00

Я прочитал его из Excel-Export MS Project в кадр данных pandas.

При преобразовании с

to_datetime(df["Anfang"], format= '%d %B %Y %H:%M').dt.date

но получить ошибку

ValueError: time data '07 Januar 2019 07:00' does not match format '%d %B %Y %H:%M' (match)

из https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior

%B   Month as locale’s full name.   September

Что я здесь делаю неправильно? Нужно ли проверять какие-то локальные настройки? Я использую немецкий (швейцарский)

import locale
locale.getdefaultlocale()
('de_CH', 'cp1252')

df in:

0       10 April 2019 08:00
1      07 Januar 2019 07:00
2      07 Januar 2019 07:00
3      07 Januar 2019 07:00
4     09 Oktober 2019 17:00
5    04 Dezember 2020 17:00
Name: Anfang, dtype: object

df out (разыскивается):

0       10-04-2019
1       07-01-2019
.
.

EDIT: я изменил свою локаль на ('de_DE', 'cp1252'), но получаю ту же ошибку.

РЕШЕНО: Используя ответ matJ, я получил ошибку, что «Die 15.06.21» не соответствует формату, что заставило меня исследовать данные. Там я нашел два разных формата даты (спасибо, Microsoft!). После очистки приведенный выше код работал хорошо!!! Таким образом, сообщение об ошибке to_datetime не было точным, как datetime.strptime.

Спасибо за помощь.

Йоханнес


person nanuuq    schedule 13.06.2019    source источник
comment
Возможный дубликат Как мне strftime объект даты в другом регионе?   -  person LinPy    schedule 13.06.2019
comment
@LinSel: я проверил это, но я не хочу менять язык. Мне не удалось найти информацию о том, распознается ли локаль de_CH программой strftime. Если это не так, я буду использовать dateparser.   -  person nanuuq    schedule 13.06.2019


Ответы (2)


Я бы изменил локаль по-другому. Тогда ваш код должен работать.

Для меня работает следующее:

import locale
from datetime import datetime 

locale.setlocale(locale.LC_ALL, 'de_DE')  # changing locale to german 
datetime.strptime('07 Januar 2019 07:00', '%d %B %Y %H:%M')  # returns a datetime obj which you can format as you like 

Дайте мне знать, если это сработает и для вас.

person turnman    schedule 13.06.2019
comment
Ваш подход привел меня к решению, собственно к проблеме. При использовании его с df_tp_cm["Anfang"].apply(lambda x: datetime.strptime(x,'%d %B %Y %H:%M')) я получил ошибку о значении, которое не совпадало (странный экспорт MS Project, два разных формата даты...). При очистке мой первоначальный подход также работал хорошо! Но там я получил неправильное значение ошибки, которое не совпало (Die 15.06.21). Большое спасибо! - person nanuuq; 13.06.2019

Одним из возможных решений является использование модуля dateparser:

import dateparser

df['Anfang'] = df['Anfang'].apply(dateparser.parse)
print (df)
               Anfang
0 2019-04-10 08:00:00
1 2019-01-07 07:00:00
2 2019-01-07 07:00:00
3 2019-01-07 07:00:00
4 2019-10-09 17:00:00
5 2020-12-04 17:00:00

import dateparser

df['Anfang'] = df['Anfang'].apply(dateparser.parse).dt.date
print (df)
       Anfang
0  2019-04-10
1  2019-01-07
2  2019-01-07
3  2019-01-07
4  2019-10-09
5  2020-12-04
person jezrael    schedule 13.06.2019
comment
Это прекрасно работает. Но было бы неплохо работать только с pandas. - person nanuuq; 13.06.2019
comment
@nanuuq - согласен, но думаю, что невозможно (по моим сведениям, может я ошибаюсь) - person jezrael; 13.06.2019