2010-10-29 174 views
9

我想'以这种格式解析日期,但忽略部分字符串。 '周三,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日等日期时会进行猜测)。我基本上只想尝试接受我在订单中指定的格式,直到我得到一个匹配。

回答

1

我不认为这是完全可以做到没有字符串操作,但也许这是一个选项。看看时间,尝试这样的:

datetime(*(time.strptime('Wed, 27 Oct 1770 22:17:00 GMT', '%a, %d %b %Y %H:%M:%S %Z')[0:5])) 
0

似乎没有成为一个办法做到这一点的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) 
4

你真的看了dateutil的文档吗?

dateutil.parser.parse()确实有参数let you control其格式猜测的优先级,它也有ignoretz=True参数。

如果这还不够,可能会有一些类可以重写以实现自己的优先规则。

当然,如果没有,你可能将不得不求助于字符串解析,因为Python的strptime()实现调用底层的C实现来解析时区名称。 (我不知道为什么它不是为你理解EST,但它可能是系统范围的,在某些系统上不是问题)

3
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') 
+5

纯代码答案本身没有帮助,因为它们倾向于推广_copy-and-paste编程。只要有可能,应该给出代码的解释和_why_它的作用。 :) – Miguel 2012-11-04 01:23:26

+0

尽管我同意@Miguel,但对于解决问题的唯一答案+1。 – 2012-11-04 01:24:45

+0

是不是这样简单:''.join('星期三,2011年10月17日22时22分22秒+ 0300'.split()[1:6])上述不会工作时区设置的B/C。你会得到ValueError:未转换的数据仍然存在 – radtek 2014-11-13 16:34:49