gpt4 book ai didi

python - 在不使用默认值的情况下在 python 中解析日期

转载 作者:太空狗 更新时间:2023-10-29 17:32:29 24 4
gpt4 key购买 nike

我正在使用 python 的 dateutil.parser 工具来解析我从第三方提要中获取的一些日期。它允许指定一个默认日期,它本身默认为今天,用于填充解析日期的缺失元素。虽然这通常很有帮助,但我的用例没有合理的默认值,我更愿意将部分日期视为我根本没有获得日期(因为它几乎总是意味着我得到乱码数据)。我已经编写了以下解决方法:

from dateutil import parser
import datetime

def parse_no_default(dt_str):
dt = parser.parse(dt_str, default=datetime.datetime(1900, 1, 1)).date()
dt2 = parser.parse(dt_str, default=datetime.datetime(1901, 2, 2)).date()
if dt == dt2:
return dt
else:
return None

(此代码段仅查看日期,因为这是我对我的应用程序关心的全部内容,但可以扩展类似的逻辑以包含时间部分。)

我想知道(希望)有更好的方法来做到这一点。解析同一个字符串两次只是为了查看它是否填充了不同的默认值,这至少可以说是一种严重的资源浪费。

这是针对预期行为的一组测试(使用 nosetest 生成器):

import nose.tools
import lib.tools.date

def check_parse_no_default(sample, expected):
actual = lib.tools.date.parse_no_default(sample)
nose.tools.eq_(actual, expected)

def test_parse_no_default():
cases = (
('2011-10-12', datetime.date(2011, 10, 12)),
('2011-10', None),
('2011', None),
('10-12', None),
('2011-10-12T11:45:30', datetime.date(2011, 10, 12)),
('10-12 11:45', None),
('', None),
)
for sample, expected in cases:
yield check_parse_no_default, sample, expected

最佳答案

根据您的域,以下解决方案可能有效:

DEFAULT_DATE = datetime.datetime(datetime.MINYEAR, 1, 1)

def parse_no_default(dt_str):
dt = parser.parse(dt_str, default=DEFAULT_DATE).date()
if dt != DEFAULT_DATE:
return dt
else:
return None

另一种方法是猴子补丁解析器类(这是非常骇人听闻的,所以如果您有其他选择,我不会推荐它):

import dateutil.parser as parser
def parse(self, timestr, default=None,
ignoretz=False, tzinfos=None,
**kwargs):
return self._parse(timestr, **kwargs)
parser.parser.parse = parse

您可以按如下方式使用它:

>>> ddd = parser.parser().parse('2011-01-02', None)
>>> ddd
_result(year=2011, month=01, day=02)
>>> ddd = parser.parser().parse('2011', None)
>>> ddd
_result(year=2011)

通过检查结果 (ddd) 中可用的成员,您可以确定何时返回 None。当所有字段可用时,您可以将 ddd 转换为 datetime 对象:

# ddd might have following fields:
# "year", "month", "day", "weekday",
# "hour", "minute", "second", "microsecond",
# "tzname", "tzoffset"
datetime.datetime(ddd.year, ddd.month, ddd.day)

关于python - 在不使用默认值的情况下在 python 中解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8434854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com