我正在尝试将以字符串形式给出的datatime对象列表转换为各个日期时间对象。
e.g. x = "[datetime.datetime(2014, 12, 14, 0, 0), datetime.datetime(2015, 5, 4, 0, 0), datetime.datetime(2015, 5, 26, 0, 0), datetime.datetime(2015, 9, 26, 0, 0)]"
我尝试使用' ast.literal_eval(x)'然后我可以使用strftime来获取格式,但是ast.literal会抛出' ValueError:格式错误的字符串' 错误。
如何从中提取日期时间?
答案 0 :(得分:1)
ast.literal_eval()
特别限制它支持的类型。您最好将数据序列化为其他格式,因此请勿使用str(inputlist)
,但要查找其他序列化。
如果你坚持使用当前格式,可以使用正则表达式:
from datetime import datetime
import re
dt_constructor = re.compile(r'datetime\.datetime\((\d+),\s*(\d+),\s*(\d+),\s*(\d+),\s*(\d+)\)')
result = [datetime(*map(int, group)) for group in dt_constructor.findall(x)]
正则表达式为每个datetime.datetime()
调用提取字符串中的数字参数,并在将它们传递给datetime()
构造函数之前将它们转换为整数。
演示:
>>> from datetime import datetime
>>> import re
>>> dt_constructor = re.compile(r'datetime\.datetime\((\d+),\s*(\d+),\s*(\d+),\s*(\d+),\s*(\d+)\)')
>>> x = "[datetime.datetime(2014, 12, 14, 0, 0), datetime.datetime(2015, 5, 4, 0, 0), datetime.datetime(2015, 5, 26, 0, 0), datetime.datetime(2015, 9, 26, 0, 0)]"
>>> [datetime(*map(int, group)) for group in dt_constructor.findall(x)]
[datetime.datetime(2014, 12, 14, 0, 0), datetime.datetime(2015, 5, 4, 0, 0), datetime.datetime(2015, 5, 26, 0, 0), datetime.datetime(2015, 9, 26, 0, 0)]