Python strptime芬兰语

时间:2015-10-27 18:22:29

标签: python datetime localization finnish

我有一个芬兰语代表日期( tiistaina,27。lokakuuta 2015 ),我需要将其转换为日期时间对象。但是,Python中的日期时间库无法识别日期和月份名称

我希望以下内容能够起作用:

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而不是tiistai na 和月份是lokakuu而不是lokakuu na

http://people.uta.fi/~km56049/finnish/timexp.html似乎暗示,根据具体情况,有不同的方式用芬兰语表示一天或一个月。

我如何将字符串tiistaina, 27. lokakuuta 2015添加到日期时间对象?

2 个答案:

答案 0 :(得分: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

它可以工作,但PyICU是一个很大的依赖项,你必须阅读大多数事情的C ++文档。

如果您dateparser moduleadd 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

答案 1 :(得分:1)

星期和月份名称的日期分别代替%A%B的主格;但是,该日期格式在电子邮件情况下具有DOW,而在部分情况下具有该月份。在一般情况下,芬兰语中的Declension非常复杂,但是对于这种情况,您可以使用na为DOW名称添加后缀以获取所需的essive,并将ta添加到该月以获得参与者。

因此,strptime格式'%Ana, %d. %Bta %Y' fi_FI语言环境保证适用于您的所有日期:

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