将日期时间列表从字符串格式转换为datetime对象

时间:2017-11-14 18:28:34

标签: python datetime split

我正在尝试将以字符串形式给出的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:格式错误的字符串' 错误。

如何从中提取日期时间?

1 个答案:

答案 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)]