如何从Python日期时间对象中删除未转换的数据

Ben*_*ing 26 python datetime strptime

我有一个大多数正确的日期时间的数据库,但有一些像这样破了: Sat Dec 22 12:34:08 PST 20102015

没有无效年份,这对我有用:

end_date = soup('tr')[4].contents[1].renderContents()
end_date = time.strptime(end_date,"%a %b %d %H:%M:%S %Z %Y")
end_date = datetime.fromtimestamp(time.mktime(end_date))
Run Code Online (Sandbox Code Playgroud)

但是一旦我遇到一个无效年份的物体,我就会得到ValueError: unconverted data remains: 2,这很好,但我不确定如何最好地剥离一年中的坏人物.它们的范围从2到6 unconverted characters.

有什么指针吗?我只想切片,end_date但我希望有一个日期安全策略.

Ada*_*eld 16

除非你想重写strptime(一个非常糟糕的主意),你唯一真正的选择就是end_date在最后切掉并切掉多余的字符,假设这会给你正确的结果.

例如,您可以捕获ValueError,切片,然后重试:

def parse_prefix(line, fmt):
    try:
        t = time.strptime(line, fmt)
    except ValueError as v:
        if len(v.args) > 0 and v.args[0].startswith('unconverted data remains: '):
            line = line[:-(len(v.args[0]) - 26)]
            t = time.strptime(line, fmt)
        else:
            raise
    return t
Run Code Online (Sandbox Code Playgroud)

例如:

parse_prefix(
    '2015-10-15 11:33:20.738 45162 INFO core.api.wsgi yadda yadda.',
    '%Y-%m-%d %H:%M:%S'
) # -> time.struct_time(tm_year=2015, tm_mon=10, tm_mday=15, tm_hour=11, tm_min=33, ...
Run Code Online (Sandbox Code Playgroud)


kin*_*all 16

是的,我只是砍掉额外的号码.假设它们总是附加到日期字符串,那么这样的东西可以工作:

end_date = end_date.split(" ")
end_date[-1] = end_date[-1][:4]
end_date = " ".join(end_date)
Run Code Online (Sandbox Code Playgroud)

我打算尝试从异常中获取多余的数字,但在我安装的Python版本(2.6.6和3.1.2)中,实际上并不存在信息; 它只是说数据与格式不符.当然,你可以继续一次删掉一个数字并重新解析,直到你没有得到异常.

你也可以编写一个只匹配有效日期的正则表达式,包括一年中正确的位数,但这似乎有点过分.

  • +1,切掉多余的是最好的方法.这是一个相当简单的单行程来做同样的事情:`end_date = end_date [:end_date.rindex("")+5]` (3认同)

ske*_*r88 6

这是我使用的更简单的单行:

end_date = end_date[:-4]


eyq*_*uem 5

改进(我希望)Adam Rosenfield的代码:

import time

for end_date in ( 'Fri Feb 18 20:41:47 Paris, Madrid 2011',
                  'Fri Feb 18 20:41:47 Paris, Madrid 20112015'):

    print end_date

    fmt = "%a %b %d %H:%M:%S %Z %Y"
    try:
        end_date = time.strptime(end_date, fmt)
    except ValueError, v:
        ulr = len(v.args[0].partition('unconverted data remains: ')[2])
        if ulr:
            end_date = time.strptime(end_date[:-ulr], fmt)
        else:
            raise v

    print end_date,'\n'
Run Code Online (Sandbox Code Playgroud)