我有 CSV 文件,其中包含日期,看起来像:
2014-01-25 00:14:08.000
现在我解析 CSV 文件并获取日期。然后我运行一个正则表达式来检查日期是否有效(与上面的格式匹配)然后我将日期从 CSV 文件转换为 DateTime。
这怎么给了我一个 ValueError: 声明:需要超过 3 个值来解包。 CSV 文件可以包含数以千计的记录,这些记录的日期与上述类似。
我的正则表达式:
date_re_time_norm = re.compile("""^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[ ](\d\d:\d\d:\d\d.\d\d\d)$""", re.I)
我的转换方法:
def convert_date(self, dstring):
if self.date_re_time_norm.match(dstring):
year, month, day, hour, minute, second = str(dstring).split('-')
return datetime(int(year), int(month), int(day), int(hour), int(minute), int(second), 0, 0, 0, 0, 0, 0)
为了便于阅读,缩短了方法。
我做错了什么吗?
请您参考如下方法:
用datetime.strptime会好很多:
from datetime import datetime
d = datetime.strptime("2014-01-25 00:14:08.000", "%Y-%m-%d %H:%M:%S.%f")
这可以替换您的两个正则表达式,因为如果格式合适,它将解析日期,否则会引发错误:
def convert_date(self, dstring, format="%Y-%m-%d %H:%M:%S.%f"):
try:
return datetime.strptime(dstring, format)
except ValueError:
# wrong format
(您可以根据需要将格式字符串设为类或实例属性)。
编辑:如果您决心坚持使用正则表达式,则需要进行更多拆分:
date, time = dstring.split(" ")
year, month, day = date.split("-")
hour, minute, second = time.split(":")
second = second.split(".")[0]
return datetime(*map(int, (year, month, day, hour, minute, second)))
然而,在 Python 中,"There should be one-- and preferably only one --obvious way to do it"那就是 strptime。
