将字符串转换为日期列表

时间:2015-12-16 23:06:25

标签: python python-3.x

我正在读取一个日期列表,这些日期已作为字符串文件保存到sql文件中 - 它的格式为"[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"。是否有一种简单的方法可以将其从字符串转换为原始格式?

[n.b。所有我能想到的都是用正则表达式解析它,但我希望有一种更简单的方法]

4 个答案:

答案 0 :(得分:3)

您可以将代码转换为ast.literal_eval可以解析的内容,然后将其转换回datetime.date个对象:

import ast
import datetime

d = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
dates = [datetime.date(*args) for args in ast.literal_eval(d.replace('datetime.date', ''))]

这可以避免eval的潜在安全问题,同时仍然相当简单。

答案 1 :(得分:1)

from dateutil.parser import parse

d = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"

reverse_date = lambda x: ','.join(x.split(',')[::-1])
clean_up = lambda x: x.replace('datetime.date(','').replace(')','')

[parse(reverse_date(clean_up(x))) for x in d[1:-1].split('),')]

输出:

[datetime.datetime(2003, 4, 2, 0, 0), datetime.datetime(2003, 6, 2, 0, 0)]

答案 2 :(得分:1)

有时候,正则表达式确实是工作的正确工具 - 我不认为以下代码过于复杂,而且其意图似乎非常明确:

from dateutil.parser import parse
import re

s = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
c = re.compile("datetime.date\((.*?)\)")
date_strings = c.findall(s)
print [parse(date_string).date() for date_string in date_strings]

如果您无法访问dateutil模块,那么您还可以推送自己的parse功能:

import datetime
import re

def parse(s):
    year, month, day = s.split(', ')
    year, month, day = int(year), int(month), int(day)
    return datetime.date(year, month, day)

s = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
c = re.compile("datetime.date\((.*?)\)")
date_strings = c.findall(s)
print [parse(date_string) for date_string in date_strings]

答案 3 :(得分:0)

这个,但是eval是危险的,所以你可能想要正则它来检查它是否是你期望的格式。

import re
import datetime
strdates = "[datetime.date(2003, 2, 4), datetime.date(2003, 2, 6)]"
if re.search(r"\[(datetime\.date\(\d{4},\ *\d{1,2},\ *\d{1,2}\),?\ *)+]", strdates):
  dates = eval(strdates)
  for date in dates:
    print date

因此,如果您信任您的数据库,则可以删除正则表达式。