【问题标题】:Parse French date in python在python中解析法语日期
【发布时间】:2014-12-05 07:45:06
【问题描述】:

谁能告诉我如何在 Python 中解析法语日期?抱歉,如果问题是重复的,但我找不到。

这是我尝试使用 dateutil 解析器的方法:

import locale
from dateutil.parser import parse as parse_dt
locale.setlocale(locale.LC_TIME, 'fr_FR.UTF-8')   ## first I set locale
## locale.LC_TIME, 'fr_FR.UTF-8')
parse_dt('3 juillet',fuzzy= True)   ## don't work give the default month
## Out[29]: datetime.datetime(2014, 10, 3, 0, 0)
parse_dt(u'4 Août ',fuzzy= True)     ## same thing using another month 

编辑:添加一些上下文:

我在事先不知道我的字符串格式的情况下解析日期。这个想法是在飞行中解析许多日期:

parse_dt(u'Aujourd''hui ',fuzzy= True) 
parse_dt(u'Hier',fuzzy= True) 

使用另一个库编辑:

使用 parsedatime 库和一些正则表达式来翻译法语单词,我可以得到:

import parsedatetime
import re 
cal = parsedatetime.Calendar()
cal.parse(re.sub('juil.*' ,'jul' ,'20 juillet'))
 ((2015, 7, 20, 10, 25, 47, 4, 283, 1), 1)

也许我应该把它推广到所有法国月份?

【问题讨论】:

标签: python parsing date localization internationalization


【解决方案1】:

dateparser module 可以解析问题中的日期:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import dateparser # $ pip install dateparser

for date_string in [u"Aujourd'hui", "3 juillet", u"4 Août", u"Hier"]:
    print(dateparser.parse(date_string).date())

它使用simple yaml config 将日期翻译成英文,并将日期字符串传递给dateutil.parser

输出

2015-09-09
2015-07-03
2015-08-04
2015-09-08

【讨论】:

  • 这比设置语言环境超级有效且容易得多
【解决方案2】:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import parsedatetime as pdt # $ pip install parsedatetime pyicu

calendar = pdt.Calendar(pdt.Constants(localeID='fr', usePyICU=True))
for date_string in [u"Aujourd'hui", "3 juillet", u"4 Août", u"Hier"]:
    dt, success = calendar.parseDT(date_string)
    if success:
       print(date_string, dt.date())

输出

3 juillet 2015-07-03
4 Août 2015-08-04

Aujourd'hui, Hier 无法识别(parsedatetime 1.4)。

github 上的当前版本(未来 1.5)支持自定义日期偏移量。可以用来解析Aujourd'hui, Hier:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import parsedatetime as pdt

class pdtLocale_fr(pdt.pdt_locales.pdtLocale_icu):
    def __init__(self):
        super(pdtLocale_fr, self).__init__(localeID='fr_FR')
        self.dayOffsets.update({u"aujourd'hui": 0, u'demain': 1, u'hier': -1})

pdt.pdtLocales['fr_FR'] = pdtLocale_fr

calendar = pdt.Calendar(pdt.Constants(localeID='fr_FR', usePyICU=False))
for date_string in [u"Aujourd'hui", "3 juillet", u"4 Août", u"Hier",
                    u"au jour de hui", u"aujour-d’hui",
                    u"au-jour-d’hui", "demain", "hier",
                    u"today", "tomorrow", "yesterday"]:
    dt, rc = calendar.parseDT(date_string)
    if rc > 0:
       print(date_string, dt.date())

latest version

输出

Aujourd'hui 2014-10-11
3 juillet 2015-07-03
4 Août 2015-08-04
Hier 2014-10-10
demain 2014-10-12
hier 2014-10-10
today 2014-10-11
tomorrow 2014-10-12
yesterday 2014-10-10

要安装它,运行:

$ pip install git+https://github.com/bear/parsedatetime

【讨论】:

    【解决方案3】:

    首先检查你的 repo 中是否有正确的语言环境:

    $ locale -a
    C
    C.UTF-8
    de_AT.utf8
    de_BE.utf8
    de_CH.utf8
    de_DE.utf8
    de_LI.utf8
    de_LU.utf8
    en_AG
    en_AG.utf8
    en_AU.utf8
    en_BW.utf8
    en_CA.utf8
    en_DK.utf8
    en_GB.utf8
    en_HK.utf8
    en_IE.utf8
    en_IN
    en_IN.utf8
    en_NG
    en_NG.utf8
    en_NZ.utf8
    en_PH.utf8
    en_SG.utf8
    en_US.utf8
    en_ZA.utf8
    en_ZM
    en_ZM.utf8
    en_ZW.utf8
    POSIX
    

    如果没有,请执行:

    $ sudo locale-gen fr_FR.UTF-8
    Generating locales...
      fr_FR.UTF-8... done
    Generation complete.
    

    然后回到python:

    $ python
    >>> import locale
    >>> import datetime
    >>> locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
    'fr_FR.UTF-8'
    >>>
    >>> date_txt = "Dimanche 3 Juin 2012"
    >>> DATE_FORMAT = "%A %d %B %Y"
    >>> datetime.datetime.strptime(date_txt, DATE_FORMAT)
    datetime.datetime(2012, 6, 3, 0, 0)
    >>>
    

    使用自定义日期格式:

    >>> date_txt = "3 juillet"
    >>> DATE_FORMAT = "%d %B"
    >>> datetime.datetime.strptime(date_txt, DATE_FORMAT)
    datetime.datetime(1900, 7, 3, 0, 0)
    

    您会意识到,如果未指定年份,则默认设置为 1900

    【讨论】:

    • 谢谢。我忘了提到我在解析之前不知道确切的格式。我也可以得到类似Aujourd'huihier 的东西。看来我应该做我的个人字典翻译了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多