【问题标题】:Parsing non-zero padded timestamps in Python在 Python 中解析非零填充时间戳
【发布时间】:2014-10-06 10:46:12
【问题描述】:

我想从时间戳中获取日期时间,如下所示:3/1/2014 9:55datetime.strptime,或类似的东西。

月份、日期和小时不是零填充的,但似乎没有列出的格式化指令here 能够自动解析。

这样做的最佳方法是什么?谢谢!

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    strptime 能够解析非填充值。它们在格式化代码表中被记录为填充的事实适用于strftime 的输出。所以你可以使用

    datetime.strptime(datestr, "%m/%d/%Y %H:%M")
    

    【讨论】:

      【解决方案2】:

      strptime 不需要填充 0 的值。请参阅下面的示例

      datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
      output:   datetime.datetime(2014, 3, 1, 9, 55)
      

      【讨论】:

        【解决方案3】:

        非模式方式是使用dateutil.parse模块,它可以解析常见的日期格式,即使你不知道它当前使用的是什么
        例如:

        >>> import dateutil.parser
        >>> 
        >>> utc_time     = '2014-08-13T00:00:00'
        >>> verbose_time = '13-Aug-2014'
        >>> some_locale  = '3/1/2014 9:55'
        >>> dateutil.parser.parse(utc_time)
        datetime.datetime(2014, 8, 13, 0, 0)
        >>> dateutil.parser.parse(verbose_time)
        datetime.datetime(2014, 8, 13, 0, 0)
        >>> dateutil.parser.parse(some_locale)
        datetime.datetime(2014, 3, 1, 9, 55)
        

        【讨论】:

          【解决方案4】:

          以防万一这个答案对其他人有帮助 - 我来到这里以为我遇到了零填充问题,但它实际上与 12:00 vs 00:00 和 %I 格式化程序有关。

          %I 格式化程序旨在匹配 12 小时制的小时数,可选填零。但根据您的数据源,您可能会得到表明午夜或中午实际上为零的数据,例如:

          >>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
          ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'
          

          strptime 真正想要的是 12,而不是 0:

          >>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
          datetime.datetime(2015, 1, 1, 0, 12)
          

          但我们并不总是控制我们的数据源!对于这种边缘情况,我的解决方案是捕获异常,尝试使用 %H 对其进行解析,并快速检查我们是否处于我们认为处于的边缘情况中。

          def get_datetime(string):
              try:
                  timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
              except ValueError:
                  # someone used zero for midnight?
                  timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
                  assert string.lower().endswith('am')
                  assert timestamp.hour == 0
              return timestamp
          

          【讨论】:

          • 0:12am 输入无效。应该是12:12am11:59 pm 后跟 12:00 am,而不是 0:00am。可能有多种方法以错误的时间格式提供数据,例如,输入可能使用两位数年份 (%y) 而不是四位数年份 (%Y) 或日/月可能被交换 (%m/%d%d/%m) 等。日/月情况可能不明确,例如2015/10/12 是“10 月12 日”还是“12 月10 日”?顺便说一句,您应该使用%Y/%m/%d 而不是%m/%d/%Y 来匹配您的输入格式。
          • 谢谢,我确实意识到这是无效输入,正如我所说,它来自我无法控制的数据源。
          【解决方案5】:

          你可以看到strftime文档here,但实际上它们并不是在所有平台上都能正常工作,例如,%-d,%-m在python 2.7的win7上不工作,所以你可以这样完成

          >>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now())  
          >>> print(date_str)
          2016-5-23
          

          【讨论】:

          • 在原生 Windows 中,用哈希代替破折号:%#d%#m。但破折号和散列 mods 仅在字符串格式 (strftime) 中需要,在解析 (strptime) 中不需要。
          猜你喜欢
          • 2018-07-02
          • 2019-09-16
          • 2017-04-13
          • 2021-07-25
          • 2017-11-22
          • 2021-11-05
          • 2021-06-30
          • 1970-01-01
          • 2018-06-20
          相关资源
          最近更新 更多