Python 使用dateutil.parser以另一种语言解析日期
Dateutil是以字符串格式解析日期的好工具。比如说Python 使用dateutil.parser以另一种语言解析日期,python,date,localization,internationalization,python-dateutil,Python,Date,Localization,Internationalization,Python Dateutil,Dateutil是以字符串格式解析日期的好工具。比如说 from dateutil.parser import parse parse("Tue, 01 Oct 2013 14:26:00 -0300") 返回 datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800)) 但是, parse("Ter, 01 Out 2013 14:26:00 -0300") # In portuguese 产生以下错误: Va
from dateutil.parser import parse
parse("Tue, 01 Oct 2013 14:26:00 -0300")
返回
datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800))
但是,
parse("Ter, 01 Out 2013 14:26:00 -0300") # In portuguese
产生以下错误:
ValueError:未知的字符串格式
有人知道如何让dateutil知道语言环境吗?据我所知,dateutil还不知道语言环境 我可以想出三个备选建议:
- 日期和月份名称在
中硬编码(作为dateutil.parser
类的一部分)。您可以将parserinfo子类化,并将这些名称替换为葡萄牙语的适当名称parserinfo
- 修改dateutil以根据用户的区域设置获取日期和月份名称。所以你可以做一些像
我启动了一个fork,它从import locale locale.setlocale(locale.LC_ALL, "pt_PT") from dateutil.parser import parse parse("Ter, 01 Out 2013 14:26:00 -0300")
模块(具有区域设置意识)中获取名称,以处理以下问题: 现在它适用于葡萄牙语(或者似乎适用),但在我向主分支提交补丁之前,我想再考虑一下。特别是,当它面对西欧语言中没有使用的字符时,可能会发生奇怪的事情。我还没有测试过这个。(见附件)日历
- 如果您没有绑定到dateutil模块,则可以使用datetime,它已经具有区域设置意识:
(请注意,from datetime import datetime, date import locale locale.setlocale(locale.LC_ALL, "pt_PT") datetime.strptime("Ter, 01 Out 2013 14:26:00 -0300", "%a, %d %b %Y %H:%M:%S %z")
标记为。)%z
datetime.strtime()
作为:
结果:
datetime.datetime(2013, 1, 28, 14, 26, tzinfo=tzoffset(None, -10800))
我认为最好的解决方案是从dateutil中对解析器进行子类化,并使用
calendar
lib常量。这是一个简单的解决方案,我没有对它进行过很多测试,所以请谨慎使用
它非常简单,可以本地化许多语言的dateutil。创建一个模块localeparseinfo.py
:
import calendar
from dateutil import parser
class LocaleParserInfo(parser.parserinfo):
WEEKDAYS = zip(calendar.day_abbr, calendar.day_name)
MONTHS = list(zip(calendar.month_abbr, calendar.month_name))[1:]
现在,您可以使用新的parseinfo对象作为dateutil.parser
的参数
In [1]: import locale;locale.setlocale(locale.LC_ALL, "pt_BR.utf8")
In [2]: from localeparserinfo import LocaleParserInfo
In [3]: from dateutil.parser import parse
In [4]: parse("Ter, 01 Out 2013 14:26:00 -0300", parserinfo=PtParserInfo())
Out[4]: datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800))
看,这解决了许多不同的语言解析,但对于所有可能的日期和时间来说,这是一个不完整的解决方案。看看dateutilparser.py
,特别是parserinfo
类变量。看看HMS变量和其他变量
您甚至可以将区域设置字符串作为参数传递给parserinfo类。有一种方法为使用
dateutil
进行解析添加了语言支持。不过,我看不到葡萄牙人的支持。相关:相关:你链接的答案是错误的。我在那里留下了相应的评论。我的意思是关于%z的答案。
datetime.datetime(2013, 1, 28, 14, 26, tzinfo=tzoffset(None, -10800))
import calendar
from dateutil import parser
class LocaleParserInfo(parser.parserinfo):
WEEKDAYS = zip(calendar.day_abbr, calendar.day_name)
MONTHS = list(zip(calendar.month_abbr, calendar.month_name))[1:]
In [1]: import locale;locale.setlocale(locale.LC_ALL, "pt_BR.utf8")
In [2]: from localeparserinfo import LocaleParserInfo
In [3]: from dateutil.parser import parse
In [4]: parse("Ter, 01 Out 2013 14:26:00 -0300", parserinfo=PtParserInfo())
Out[4]: datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800))