2012-08-22 10 views
5

私は、(文字列で)値と時間の両方を持つ大量のデータを扱っています。Pythonで24時間以上の時間値を扱うにはどうすればいいですか?

私は次のコードで日時の値に文字列の時間値を変換しています:24:00:00.004

time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 

唯一の問題は私のデータの一部はフォーマットを持っていることです。 ValueError:時間データ '24:00:00:004' 形式 '%のHと一致していません:%Mを:%のS
だからデータの一部は実際には24時間以上

Pythonは私にこのエラーを与えているです。 %F」

この問題

答えて

8

%Hパラメータを対処する方法上の任意のアイデアは0〜23の範囲内の値を解析することができます。手動でそれらの特定のタイムスタンプに対処する必要があります:

try: 
    time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 
except ValueError: 
    time = time.replace(' 24', ' 23') 
    time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 
    time += datetime.timedelta(hours=1) 
+0

're'を使ったいくつかのより醜い解決策の代わりに' replace'を使用できるように、ここには時間の前にスペースがあったのは幸運です。 – mgilson

+2

@mgilson:その場合は、 '23 '+ time [2:]'を代わりに使用していて、おそらく 'time.startswith(' 24 ')'と組み合わせていたでしょう。 –

+1

'.replace()'も 'count'パラメータを持っています。私はしばしば偶発的な二次的な置換を避けるためにそれを使用します。スペースなしの場合は、それもうまくいったかもしれません。 – DSM

2

は別途時間を解析してみてください。あなたが多分必要がありますので、あなたのデータは日付が含まれていないよう

hours, rest = time.split(':', 1) 
time = datetime.timedelta(hours=int(hours)) + datetime.datetime.strptime(rest, "%M:%S.%f") 
+0

@ J.F.Sebastianありがとう、修正されました。 – ecatmur

1

はようだが、時間がまたがりますデータをtimedeltaとしてdatetimeの代わりに保存します。


あなたは、文字列からtimedeltaを作成するthis機能を使用することができます。

'24:00:00.004'

このような

>>>t = parseTimeDelta('24:00:00.04')

お時間の文字列を解析

import re 
from datetime import timedelta 

def parseTimeDelta(s): 
    d = re.match(
      r'((?P<days>\d+) days,)?(?P<hours>\d+):' 
      r'(?P<minutes>\d+):(?P<seconds>\d+)\.(?P<milliseconds>\d+)', 
      str(s)).groupdict(0) 
    return timedelta(**dict(((key, int(value)) 
           for key, value in d.items()))) 

が表現はtimedeltaにつながりますこのように

>>> print t
1 day, 0:00:00.004000

+0

'%f'はミリ秒ではなくマイクロ秒にマッチします。 'str()'を不必要に呼び出さないでください。 – jfs

関連する問題