2017-04-30 11 views
0

私の問題はここではほとんど解決されていませんでしたが、それらのすべてが大きく投票されましたが、試してみるとプログラムがクラッシュします。ミリ秒精度の時間文字列を操作する

したがって、文字列をdatetimeオブジェクトに変換してから、時間を追加または減算する必要があります。 すべての文字列は、00時00分40秒249ミリ秒をマークする同じ構造 - > 00:00:40,249(例)を共有します。 datetimeオブジェクトに変換すると、次のようになります。

00:00:40.249000(余分な3ゼロマーキングマイクロ秒)。

時刻を同じ形式で取得するには、これらの3つのゼロを削除する必要があります。

私がこれまでに見つけた解決策のすべてはかなり簡単でした。私のコードの今日:

datetime.datetime.strptime(line.partition(saparator)[0], '%H:%M:%S,%f').time() 

ソリューションは、私が見つけた:

はTypeError::私はので、私は次のですか

datetime.datetime.strptime(line.partition(saparator)[0], '%H:%M:%S,%f').time()[:-3] 

'datetime.timeの' オブジェクトは、添字化されていない

もう一度、これらのソリューションはアップvvotedされ、ユーザーから多くの感謝を得た、どうやって私の仕事はどう?

ありがとうございました!

+0

'が存在しないようにミリ秒を使用していないdatetime.time'目的は、利用可能な唯一の属性は、これは[XY通報](HTTPSで3つの余分ゼロ – abccd

+0

を有するマイクロ秒であります/meta.stackexchange.com/questions/66377/what-is-the-xy-problem)、あなたのコードと実際に何をしようとしているのかを示す必要があります。 –

答えて

1

文字列の代わりにdatetimeオブジェクトをスライスしようとしています。

TypeError: 'datetime.time' 

変数を文字列としてキャストし、それをスライスする必要があります。

time.isoformat() 

これは、文字列として時刻を返します:ドキュメントhereあたりのよう

0

このような文字列は、少なくとも私にとっては経過時間や時間間隔のように見えます。その場合、timedeltaオブジェクトを使用して表現することをお勧めします。これを行うメリットの1つは、任意の時間間隔を追加したり減算したりするのが簡単だということです。

最初の変換:正規表現を使用して文字列から項目を分割することを選択しましたが、もちろん最も便利な手法を使用することもできます。まず、timedelta作成関数のすべてのパラメータの辞書をtimedelta_argsに作成します。次に、この辞書の選択項目を正規表現を使ってあなたの文字列から解析した値に置き換えます。次に、辞書の値をすべてtimedeltaに渡し、この関数が期待する順序で値を設定します。 timespanの値は、そのプロパティの値と同じように私が望んだ値です。

>>> from datetime import timedelta 
>>> import re 
>>> s = '00:00:40,249' 
>>> timedelta_args = {'days':0, 'seconds':0, 'microseconds':0, 'milliseconds':0, 'minutes':0, 'hours':0, 'weeks':0} 
>>> timedelta_args['hours'], timedelta_args['minutes'], timedelta_args['seconds'], timedelta_args['milliseconds'] = map(int, re.split(r'[:,]', s)) 
>>> timespan = timedelta(*[timedelta_args[_] for _ in ['days', 'seconds', 'microseconds', 'milliseconds', 'minutes', 'hours', 'weeks']]) 
>>> timespan 
datetime.timedelta(0, 40, 249000) 
>>> timespan.seconds 
40 
>>> timespan.microseconds 
249000 

Iは容易timespanの文字列表現を取得することができ、そして限り、ミリ秒単位の数が1000以上であるように私は簡単に元の文字列を取得することができます。timespanので

>>> str(timespan) 
'0:00:40.249000' 
>>> str(timespan)[:-3] 
'0:00:40.249' 
>>> str(timespan)[:-3].replace('.', ',') 
'0:00:40,249' 

は、私はそれに追加する(およびそれから減算する)ことができるtimedeltaあります。生の結果は非常に満足のいくものではないかもしれません。しかし、すぐにこれを補う機能はstrです。

>>> timespan + timedelta(hours=3, seconds=20) 
datetime.timedelta(0, 10860, 249000) 
>>> str(timespan + timedelta(hours=3, seconds=20)) 
'3:01:00.249000' 

かなり小さなヒッチに注意していますが、フォーマットしているときは、 microsecondsプロパティがゼロの場合、文字列表現で完全にオフになります。 /:

>>> str(timespan + timedelta(hours=3, microseconds=751000)) 
'3:00:41' 
関連する問題