2015-10-27 6 views
1

У меня есть финское представление даты (tiistaina, 27. lokakuuta 2015), что мне нужно преобразовать в объект datetime. Тем не менее, в день и месяц имена не распознаются библиотекой даты и времени в PythonPython strptime finnish

Я бы ожидать что-то вроде следующего для работы:

import locale 
from datetime import datetime 

locale.setlocale(locale.LC_TIME, 'fi_FI') 
the_date = datetime.strptime('tiistaina, 27. lokakuuta 2015', '%A, %d. %B %Y') 

Однако это приводит:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/_strptime.py", line 500, in _strptime_datetime 
tt, fraction = _strptime(data_string, format) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/_strptime.py", line 337, in _strptime 
(data_string, format)) 
ValueError: time data 'tiistaina, 27. lokakuuta 2015' does not match format '%A, %d. %B %Y' 

Я думаю, что это потому, что Python ожидает, что день станет тиистаем вместо tiistai na и месяц будет lokakuu вместо lokakuu na

http://people.uta.fi/~km56049/finnish/timexp.html, похоже, предполагает, что в зависимости от контекста существуют различные способы представления дня или месяца на финском языке.

Как я могу привести строку tiistaina, 27. lokakuuta 2015 к объекту datetime?

ответ

1

'%A, %d. %B %Y' производит другую строку времени в моей системе тоже:

#!/usr/bin/env python 
import locale 
from datetime import datetime 

#NOTE: locale name is platform-dependent 
locale.setlocale(locale.LC_TIME, 'fi_FI.UTF-8') 
print(datetime(2015, 10, 27).strftime('%A, %d. %B %Y')) 
# -> tiistai, 27. lokakuu 2015 

Вы можете использовать PyICU для анализа локализованной строки даты/времени в given format:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
from datetime import datetime 
import icu # PyICU 

tz = icu.ICUtzinfo.getDefault() # any ICU timezone will do here 
df = icu.SimpleDateFormat('EEEE, dd. MMMM yyyy', icu.Locale('fi_FI')) 
df.setTimeZone(tz.timezone) 

ts = df.parse(u'tiistaina, 27. lokakuuta 2015') 
print(datetime.fromtimestamp(ts, tz).date()) 
# -> 2015-10-27 

, связанный: Python parsing date and find the correct locale_setting

Это работает b ut PyICU - большая зависимость, и вы должны читать документы C++ для большинства вещей.


Существует dateparser module, что должно работать, если вы add Finnish data to a simple yaml config -- similar to how it is done for other languages. Вот рабочий пример для голландского языка:

#!/usr/bin/env python 
import dateparser # $ pip install dateparser 

print(dateparser.parse(u'dinsdag, 27. oktober 2015', 
         date_formats=['%A, %d. %B %Y'], 
         languages=['nl']).date()) 
# -> 2015-10-27 

Связанный: Parse French date in python

0

Дни недели и месяца имена заменяются в именительном падеже для %A и %B соответственно; однако формат даты имеет DOW в сущностном случае, а месяц - в частичном. Склонение на финском языке довольно сложно в общем случае, но для этого случая вы можете суффикс имени DOW с na, чтобы получить требуемый сущ., И ta в месяц для получения частичного.

Таким образом, формат '%Ana, %d. %Bta %Y'strptime с fi_FI локали гарантированно работать для всех дат:

>>> datetime.datetime.strptime('tiistaina, 27. lokakuuta 2015', '%Ana, %d. %Bta %Y') 
datetime.datetime(2015, 10, 27, 0, 0)