【问题标题】:Python strptime finnishPython strptime 芬兰语
【发布时间】:2015-10-27 18:22:28
【问题描述】:

我有一个日期的芬兰语表示 (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 而不是 tiistaina 和月份是 lokakuu 而不是 lokakuuna

http://people.uta.fi/~km56049/finnish/timexp.html 似乎暗示在芬兰语中有不同的方式来表示一天或一个月。

如何将字符串tiistaina, 27. lokakuuta 2015 转换为日期时间对象?

【问题讨论】:

    标签: python datetime localization finnish


    【解决方案1】:

    星期几和月份名称分别用主格替换%A%B;但是,该日期格式在基本情况下具有 DOW,在部分情况下具有月份。芬兰语的变格在一般情况下相当复杂,但在这种情况下,您可以在 DOW 名称后缀na 以获得所需的主词,并在月份后缀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)
    

    【讨论】:

      【解决方案2】:

      '%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++ 文档才能了解大多数情况。


      如果您使用add Finnish data to a simple yaml config -- similar to how it is done for other languages,应该有dateparser module。这是荷兰语的一个工作示例:

      #!/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

      【讨论】:

        猜你喜欢
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多