3

假设您有时间采用这种格式:

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

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

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

但得到了

ValueError: unconverted data remains: 0

PS我正在使用Python 2.7。

4

3 回答 3

6

用于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()函数为您提供零填充值:

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

所以这样做:

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

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

于 2013-02-06T17:24:29.723 回答
3

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']
于 2013-02-06T17:31:49.363 回答
1

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

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

如果有的话,那将四舍五入(因此1033.666661034变成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]

从评论编辑

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

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]]
于 2013-02-06T17:44:17.693 回答