首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从Python datetime对象中删除未转换的数据

如何从Python datetime对象中删除未转换的数据
EN

Stack Overflow用户
提问于 2011-02-19 02:37:05
回答 5查看 113K关注 0票数 40

我有一个数据库,其中大部分是正确的日期时间,但也有一些是这样崩溃的:Sat Dec 22 12:34:08 PST 20102015

没有无效的年份,这对我来说是有效的:

代码语言:javascript
复制
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))

但是一旦我遇到一个无效年份的对象,我就会得到ValueError: unconverted data remains: 2,这很棒,但我不确定如何最好地从年份中剔除不好的字符。它们的范围从2到6 unconverted characters

有什么建议吗?我只想切分end_date,但我希望有一种datetime安全策略。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-19 02:57:12

是啊,我会把多余的号码砍掉。假设它们总是被附加到日期字符串中,那么下面这样的代码就可以工作了:

代码语言:javascript
复制
end_date = end_date.split(" ")
end_date[-1] = end_date[-1][:4]
end_date = " ".join(end_date)

我本打算从异常中获取多余的位数,但在我安装的Python版本(2.6.6和3.1.2)上,该信息实际上并不存在;它只是显示数据与格式不匹配。当然,您可以继续一次删除一个数字,然后重新解析,直到不出现异常。

您还可以编写一个仅匹配有效日期的正则表达式,包括年份中正确的位数,但这似乎有点过分了。

票数 22
EN

Stack Overflow用户

发布于 2011-02-19 02:56:27

除非您想重写strptime (这是一个非常糟糕的想法),否则您唯一真正的选择就是切分end_date并去掉末尾多余的字符,假设这会给出您想要的正确结果。

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

代码语言:javascript
复制
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

例如:

代码语言:javascript
复制
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, ...
票数 27
EN

Stack Overflow用户

发布于 2011-02-19 03:45:56

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

代码语言:javascript
复制
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'
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5045210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档