我有一个数据库,其中大部分是正确的日期时间,但也有一些是这样崩溃的: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))
但是一旦我遇到一个无效年份的对象,我就会得到ValueError: unconverted data remains: 2
,这很棒,但我不确定如何最好地从年份中剔除不好的字符。它们的范围从2到6 unconverted characters
。
有什么建议吗?我只想切分end_date
,但我希望有一种datetime安全策略。
发布于 2011-02-19 02:57:12
是啊,我会把多余的号码砍掉。假设它们总是被附加到日期字符串中,那么下面这样的代码就可以工作了:
end_date = end_date.split(" ")
end_date[-1] = end_date[-1][:4]
end_date = " ".join(end_date)
我本打算从异常中获取多余的位数,但在我安装的Python版本(2.6.6和3.1.2)上,该信息实际上并不存在;它只是显示数据与格式不匹配。当然,您可以继续一次删除一个数字,然后重新解析,直到不出现异常。
您还可以编写一个仅匹配有效日期的正则表达式,包括年份中正确的位数,但这似乎有点过分了。
发布于 2011-02-19 02:56:27
除非您想重写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
例如:
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, ...
发布于 2011-02-19 03:45:56
改进(我希望) 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'
https://stackoverflow.com/questions/5045210
复制相似问题