【问题标题】:Troubleshooting 'ValueError: time data ... does not match format' when using datetime.strptime使用 datetime.strptime 时对“ValueError:时间数据...与格式不匹配”​​进行故障排除
【发布时间】:2010-03-17 06:19:55
【问题描述】:

我的输入字符串是'16-MAR-2010 03:37:04',我想将它存储为日期时间。

我正在尝试使用:

db_inst.HB_Create_Ship_Date = datetime.strptime(fields[7]," %d-%b-%Y %H:%M:%S ") 
fields[7] = '16-MAR-2010 03:37:04' 

我收到一个错误:

::ValueError: time data '16-MAR-2010 03:37:04' does not match format ' %d-%b-%Y %H:%M:%S ' 

【问题讨论】:

    标签: python strptime


    【解决方案1】:

    编辑:
    作为John mentions,让自己更轻松,并删除前导和尾随空格。

    另一个想法:
    您当前的locale 可能没有将“MAR”指定为月份缩写。

    这段代码的输出给出了什么?:

    import locale
    locale.getdefaultlocale()
    

    我在 Linux 机器(Ubuntu 9.10、Python 2.6.4)上测试了您的代码并得到了 ValueError。
    我删除了空格,更改为非英语语言环境(捷克语),并得到了 ValueError。

    学术笔记:
    奇怪的是,您的代码可以在带有多余空格的 Windows XP Python 2.5.5 上运行:

    >>> from datetime import datetime
    >>> dt = '16-MAR-2010 03:37:04'
    >>> datetime.strptime(dt, " %d-%b-%Y %H:%M:%S ")
    datetime.datetime(2010, 3, 16, 3, 37, 4)
    

    【讨论】:

    • 语言环境模块的文档提到“”“ABMON_1 ... ABMON_12 返回第 n 个月的缩写名称”“”但这些(和其他有用的东西)似乎不存在。有什么线索吗?
    • @John:在 WinXP Python 2.5 版上使用了前导和尾随空格。刚刚在 Ubuntu (Python 2.6.4) 上尝试并得到了 ValueError。
    • 刚刚在 *nix 的 WHICH 表现上尝试了哪个版本的 Python?
    • 您感兴趣的是locale.getlocale(locale.LC_TIME),而不是可能与活动区域设置不同的getdefaultlocale()
    【解决方案2】:

    您的格式字符串有一个前导空格和一个尾随空格,但您的输入字符串没有。删除开始引号后和结束引号前的空格。

    【讨论】:

      【解决方案3】:

      去掉格式前后的空格。我认为 strptime 被记录为根据为您的盒子编写 C 运行时的人的心血来潮而有所不同。然而,我似乎错了。这意味着 Python 中存在错误。

      Windows 上的 Python 2.6.4 不喜欢前导尾随空格;见下文。

      *x 个用户,你发现了什么?

      同时,使用最小的公分母——去掉空格。正如 Adam 所提到的,您可能还遇到了语言环境问题。

      带空格:

      >>> datetime.datetime.strptime('16-MAR-2010 03:37:04'," %d-%b-%Y %H:%M:%S ")
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "C:\python26\lib\_strptime.py", line 325, in _strptime
          (data_string, format))
      ValueError: time data '16-MAR-2010 03:37:04' does not match format ' %d-%b-%Y %H
      :%M:%S '
      

      没有空格:

      >>> datetime.datetime.strptime('16-MAR-2010 03:37:04',"%d-%b-%Y %H:%M:%S")
      datetime.datetime(2010, 3, 16, 3, 37, 4)
      >>>
      

      【讨论】:

        【解决方案4】:

        试试这个:

        db_inst.HB_Create_Ship_Date = datetime.strptime(fields[7],"%d-%b-%Y %H:%M:%S")
        

        另外,有一个look here 作为 Python 中日期时间格式的参考。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-05
          • 2018-02-15
          • 1970-01-01
          • 2019-07-08
          • 2014-09-27
          • 2018-03-18
          相关资源
          最近更新 更多