使用dateutil解析多个日期

时间:2013-01-11 13:19:28

标签: python parsing python-dateutil

我试图借助这段代码在Python中解析一个字符串中的多个日期,

from dateutil.parser import _timelex, parser
a = "Approve my leave from first half of 12/10/2012 to second half of 20/10/2012 "
p = parser()
info = p.info
def timetoken(token):
  try:
    float(token)
    return True
  except ValueError:
    pass
  return any(f(token) for f in (info.jump,info.weekday,info.month,info.hms,info.ampm,info.pertain,info.utczone,info.tzoffset))

def timesplit(input_string):
  batch = []
  for token in _timelex(input_string):
    if timetoken(token):
      if info.jump(token):
        continue
      batch.append(token)
    else:
      if batch:
        yield " ".join(batch)
        batch = []
  if batch:
    yield " ".join(batch)

for item in timesplit(a):
  print "Found:", item
  print "Parsed:", p.parse(item)

并且代码将字符串中的后半部分作为第二个日期并给我这个错误,

raise ValueError, "unknown string format"

ValueError: unknown string format

当我将“下半场”改为“第三半”或“下半场”时,它的工作正常。

任何人都可以帮我解析这个字符串吗?

2 个答案:

答案 0 :(得分:2)

如果您将"second"参数设置为timesplit,则您的解析器无法处理fuzzy找到的True,它不会中断,但也不会产生任何有意义的东西。

from cStringIO import StringIO
for item in timesplit(StringIO(a)):
    print "Found:", item
    print "Parsed:", p.parse(StringIO(item),fuzzy=True)

出:

Found: 12 10 2012
Parsed: 2012-12-10 00:00:00
Found: second
Parsed: 2013-01-11 00:00:00
Found: 20 10 2012
Parsed: 2012-10-20 00:00:00

您必须修复timesplitting或处理错误:

OPT1:

info.hms

中丢失timetoken

OPT2:

from cStringIO import StringIO
for item in timesplit(StringIO(a)):
    print "Found:", item
    try:
        print "Parsed:", p.parse(StringIO(item))
    except ValueError:
        print 'Not Parsed!'

出:

Found: 12 10 2012
Parsed: 2012-12-10 00:00:00
Found: second
Not Parsed!
Parsed: Found: 20 10 2012
Parsed: 2012-10-20 00:00:00

答案 1 :(得分:0)

如果您只需要日期,可以使用正则表达式提取日期并使用日期。

a = "Approve my leave from first half of 12/10/2012 to second half of 20/10/2012 "

import re
pattern = re.compile('\d{2}/\d{2}/\d{4}')
pattern.findall(a)
['12/10/2012', '20/10/2012']