【问题标题】:Parse hours without leading zeroes by strptime in Python在 Python 中通过 strptime 解析没有前导零的小时数
【发布时间】:2013-01-22 00:04:00
【问题描述】:

假设你有这种格式的时间:

a = [..., 800.0, 830.0, 900.0, 930.0, 1000.0, 1030.0, ...]

问题是缺少几个小时的前导零。例如00:3030 表示,08:00800. 表示,00:002400 表示。 是否可以使用strptime 方法将此数据解析为time 对象? 我尝试使用以下代码

hours = [time.strptime(str(int(i)), "%H%M") for i in a]

但是得到了

ValueError: unconverted data remains: 0

附:我正在使用 Python 2.7。

【问题讨论】:

  • 那些是字符串吗?如果是这样,您需要在值周围添加 '' 引号。
  • @MartijnPieters 这些实际上是列表中的float,因此我将它们转换为int 以消除尾随点,但我想我更喜欢你的方法。

标签: python time strptime


【解决方案1】:

使用zfill 根据需要添加这些零:

hours = [time.strptime(i[:-1].zfill(4), "%H%M") for i in a]

通过使用i[:-1],我们删除了那个讨厌的尾随点,.zfill(4) 将在左侧添加足够的0 字符以使其达到 4 位数。

演示:

>>> import time
>>> a = ['800.', '830.', '900.', '30.']
>>> [time.strptime(i[:-1].zfill(4), "%H%M") for i in a]
[time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1), time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=30, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1), time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=9, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1), time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=30, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)]

如果它们是浮点值,请在它们上使用 format() function 来为您提供零填充值:

>>> format(800., '04.0f')
'0800'

这样做:

hours = [time.strptime(format(i % 2400, '04.0f'), "%H%M") for i in a]

% 2400 将您的值标准化为 0. 到 2399. 范围。

【讨论】:

    【解决方案2】:

    在这种情况下,您可以在没有strptime() 的情况下提取小时、分钟:

    >>> from datetime import time
    >>> a = [800., 830., 900., 930., 1000., 1030., 30., 2400.]
    >>> [time(*divmod(int(f) % 2400, 100)) for f in a]
    [datetime.time(8, 0), 
     datetime.time(8, 30), 
     datetime.time(9, 0), 
     datetime.time(9, 30),
     datetime.time(10, 0),
     datetime.time(10, 30),
     datetime.time(0, 30),
     datetime.time(0, 0)]
    

    如果您出于任何原因想使用strptime();您可以使用x % y 简明扼要地获得所需的格式:

    >>> ["%04.0f" % (f % 2400) for f in a]
    ['0800', '0830', '0900', '0930', '1000', '1030', '0030', '0000']
    

    【讨论】:

      【解决方案3】:

      如果那些真的是浮点文字与字符串,你可以这样做:

      a=[800., 830., 900., 930., 1000., 1030.]
      hours=[time.strptime('{:04.0f}'.format(f), '%H%M') for f in a]
      

      如果有的话,这将四舍五入(1033.66666 将是 1034,因此变为 10:34 AM

      你也可以像这样截断:

      [800.0, 830.0, 900.0, 930.0, 1000.0, 1030.0, 1033.3333333, 1033.66666]
      hours=[time.strptime(str(f).split('.')[0], '%H%M') for f in a]
      

      从 cmets 编辑

      如果您有超出范围的值,请执行以下操作:

      a=[800., 830., 900., 930., 1000., 1030., 2400.]
      hours=[time.strptime(s,'%H%M') for s in ['{:04.0f}'.format(f) if f <2400 else '0000' for f in a]]
      

      或者,您也可以让您的原始代码以这种方式工作:

      [time.strptime(i,'%H%M') for i in[str(int(f)) if f<2400 else '0000' for f in a]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多