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)中,实际上并不存在信息; 它只是说数据与格式不符.当然,你可以继续一次删掉一个数字并重新解析,直到你没有得到异常.
你也可以编写一个只匹配有效日期的正则表达式,包括一年中正确的位数,但这似乎有点过分.
改进(我希望)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)
| 归档时间: |
|
| 查看次数: |
72476 次 |
| 最近记录: |