2017-01-26 4 views
1

次の文字列を異なる形式の文字列または文字列に変換する必要があります。私の入力は、これらの例のようになります。Pythonでの文字列の時間値の解析

196hの26メートル13S
95Hの19メートル
45メートルの28S

私の目的の文字列出力は次のようになり(しかし、私の最終目標はdatetimeオブジェクトにこれらの文字列を変換することです) :

196:26:13
95:19:00
午後12時45分:28

Excelでは、[h]:mm:ssとなります。

注:あなたが見ることができるように、時間は24

よりも高くすることができ、私は解決策を持っている私はtime.strptime()方法で、この文字列を解析することを試みたが、それは24よりも高い時間では動作しません。正規表現を使用していますが、これを行うためのより簡単な方法があるかどうかを知りたいと思います。これを解決する最善の方法は何ですか?

+4

者が時間内のポイントではありません。それらは期間です。したがって、 'datetime'、' date'、 'time'は完全に間違った型です。正しい型は 'timedelta'です。これは組み込みの文字列解析メソッドを持ちません。 – jwodder

+1

私はやり直しに行くだろう – Cilyan

+0

助けてくれてありがとう!私は良い古い正規表現の方法で滞在する – patex1987

答えて

2

これはあなたの時間デルタを与えるだろう:

from datetime import timedelta 

def to_timedelta(time_string): 
    units = {'h': 'hours', 'd': 'days', 'm': 'minutes', 's': 'seconds'} 
    return timedelta(**{units[x[-1]]: int(x[:-1]) for x in time_string.split()}) 

はテスト:

times = ['196h 26m 13s', '95h 19m', '45m 28s'] 
for t in times: 
    print(to_timedelta(t)) 

出力:

8 days, 4:26:13 
3 days, 23:19:00 
0:45:28 

timedeltaは、これらの引数を取ります。

datetime.timedelta(日= 0、秒= 0、マイクロ秒= 0ミリ秒= 0、分= 0、時間= 0、週= 0)

このマッピングを使用する:

units = {'h': 'hours', 'd': 'days', 'm': 'minutes', 's': 'seconds'} 

は、文字列の短い単位を引数の対応する名前にマップできるようにします。 Pythons **構文を使用すると、結果の辞書を単一の引数として使用し、一致するキーワード引数に変換することができます。

+0

ありがとう、私はそれが好き – patex1987

1

最初に行うべきことは、正規表現を使用し、datetimeではなくtimedeltaを使用することです。

import datetime 
import re 

regex = re.compile(r'((?P<hours>\d+?)h)?((?P<minutes>\d+?)m)?((?P<seconds>\d+?)s)?') 

def parse_time(time_str): 
    parts = regex.match(time_str) 
    if not parts: 
     return 
    parts = parts.groupdict() 
    time_params = {} 
    for (name, param) in parts.items(): 
     if param: 
      time_params[name] = int(param) 
    return datetime.timedelta(**time_params) 


L = ["196h 26m 13s", "95h 19m", "45m 28s"] 

for l in L: 
    print(parse_time(l)) 

出力:

8 days, 4:00:00 
3 days, 23:00:00 
0:45:00 
+0

ありがとう!私は正規表現に基づいて非常に似たソリューションを持っていた – patex1987