【问题标题】:How to Convert to DateTime如何转换为日期时间
【发布时间】:2014-02-19 20:03:20
【问题描述】:

我有 CSV 文件,其中包含日期等内容,如下所示:

2014-01-25 00:14:08.000

现在我解析 CSV 文件并获取日期。然后我运行一个正则表达式来检查日期是否有效(与上面的格式匹配)然后我将日期从 CSV 文件转换为 DateTime。

这怎么给我一个ValueError:,上面写着:need more than 3 values to unpack。 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)

为了便于阅读,缩短了方法。

我做错了吗?

【问题讨论】:

    标签: python regex datetime csv


    【解决方案1】:

    使用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

    【讨论】:

    • 感谢您的回复,但我正在寻找与我所拥有的类似的东西......
    • 我已经相应地编辑了我的答案,但我认为你是在不必要地重新发明隐喻的轮子。
    【解决方案2】:

    您在连字符上进行拆分,其中只有两个,因此您只能在列表中获得三个元素:

    ['2014', '01', '25 00:14:08.000']
    

    查看@jonrsharpe 的答案以获得更好的方法。

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 2011-10-05
      • 2014-01-24
      相关资源
      最近更新 更多