Python解析日期格式,忽略部分字符串
我想'以这种格式解析日期,但忽略部分字符串。 '周三,1770年10月27日22:17:00格林威治标准时间'从我收集的信息来看,日期时间并不能很好地支持时区。这很好,我真的只想忽略字符串的时区部分,而不必对其进行字符串操作。有什么我可以用下面的替换%Z来说“这里有任何字符串”和解析日期?另外,我不明白为什么它会解析像PST,GMT而不是EST的时区。无论如何,它似乎没有附加tzinfo,不知道它真正寻找%Z部分的字符串是什么类型。Python解析日期格式,忽略部分字符串
>>> import datetime
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 GMT', '%a, %d %b %Y %H:%M:%S %Z')
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 PST', '%a, %d %b %Y %H:%M:%S %Z')
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 EST', '%a, %d %b %Y %H:%M:%S %Z')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/brazil-pkg-cache/packages/Python/Python-2.5.1.17.1/RHEL5_64/DEV.STD.PTHREAD/build/lib/python2.5/_strptime.py", line 331, in strptime
(data_string, format))
ValueError: time data did not match format: data=Wed, 27 Oct 1770 22:17:00 EST fmt=%a, %d %b %Y %H:%M:%S %Z
注:dateutil不是我的选择,我想支持众多格式,不能让dateutil意外地解释日期是错误的。 (即dateutil似乎在看到2010年2月1日,2月1日或1月2日等日期时会进行猜测)。我基本上只想尝试接受我在订单中指定的格式,直到我得到一个匹配。
我不认为这是完全可以做到没有字符串操作,但也许这是一个选项。看看时间,尝试这样的:
datetime(*(time.strptime('Wed, 27 Oct 1770 22:17:00 GMT', '%a, %d %b %Y %H:%M:%S %Z')[0:5]))
似乎没有成为一个办法做到这一点的strptime()。我知道你说过你不想做字符串操作,但是你可能没有选择。您可以在输入日期/时间字符串时首先执行数据清理,也可以创建mystrptime()
并仅对异常进行操作。以下代码不正确,它不处理字符串中任何位置出现%Z的一般情况,但您明白了。
import re, datetime
def mystrptime(time_str, format):
try:
return datetime.datetime.strptime(time_str, format)
except ValueError:
if not '%Z' in format:
raise # it must have been something else
new_time_str = re.sub(r'\s*\w+\s*$', '', time_str)
new_format = re.sub(r'\s*%Z\s*$', '', format)
return datetime.datetime.strptime(new_time_str, new_format)
你真的看了dateutil的文档吗?
dateutil.parser.parse()
确实有参数let you control其格式猜测的优先级,它也有ignoretz=True
参数。
如果这还不够,可能会有一些类可以重写以实现自己的优先规则。
当然,如果没有,你可能将不得不求助于字符串解析,因为Python的strptime()实现调用底层的C实现来解析时区名称。 (我不知道为什么它不是为你理解EST,但它可能是系统范围的,在某些系统上不是问题)
val = str.join(' ', 'Wed, 17 Oct 2011 22:22:22 +0300'.split(None)[1:7])
val = datetime.datetime.strptime(val, '%d %b %Y %H:%M:%S')
纯代码答案本身没有帮助,因为它们倾向于推广_copy-and-paste编程。只要有可能,应该给出代码的解释和_why_它的作用。 :) – Miguel 2012-11-04 01:23:26
尽管我同意@Miguel,但对于解决问题的唯一答案+1。 – 2012-11-04 01:24:45
是不是这样简单:''.join('星期三,2011年10月17日22时22分22秒+ 0300'.split()[1:6])上述不会工作时区设置的B/C。你会得到ValueError:未转换的数据仍然存在 – radtek 2014-11-13 16:34:49