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私はPython2.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)]

代わりに float 値の場合は、それらの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

それらが文字列に対して実際にfloatリテラルである場合は、次のように実行できます。

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]

コメントから編集

範囲外の値がある場合は、次のようにします。

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 に答える