13

可変長の文字列がありstrptime、残りの文字列を無視するためにフォーマットを指定したいと考えています。例を挙げましょう。私は次のようなものを持っています

9/4/2013,00:00:00,7.8,7.4,9.53
10/4/2013,00:00:00,8.64,7.4,9.53

strptime(line,format)そして、それらの行を読み取るコマンドを機能させるフォーマットが必要です。のようなものformat='%d/%m/%Y,%H:%M:%S*'ですが、うまくいかないことはわかっています。私の質問はこれに似ていると思いますが、答えはありません。文字列の全長が異なる可能性があるため、問題は少し悪化しています。私はdateutil自分の問題を解決できる気がしますが、そのトリックを行うものを見つけることができません。

おそらく のようなことができますstrptime(''.join(line.split(',')[:2]),format)が、ユーザー関連の問題についてはそれに頼りたくありません。

4

4 に答える 4

21

datetime.strptime()入力の一部を無視することはできません。; あなたの唯一のオプションは、余分なテキストを最初に分割することです。

そうです、文字列を分割して再結合する必要があります。

format = '%d/%m/%Y,%H:%M:%S'
datetime.strptime(','.join(line.split(',', 2)[:2]), format)

または、情報を抽出する他の手段を見つけます。たとえば、次のような正規表現を使用できます。

datetime_pattern = re.compile(r'(\d{1,2}/\d{1,2}/\d{4},\d{2}:\d{2}:\d{2})')
format = '%d/%m/%Y,%H:%M:%S'
datetime.strptime(datetime_pattern.search(line).group(), format)
于 2015-03-26T17:27:47.247 に答える
2

時間文字列を分割して余分なテキストを破棄せずにフォーマット文字列を作成するには、余分なテキストをフォーマット文字列に含めます。t[t.index(',',t.index(',') + 1):]は追加テキストです。

from datetime import datetime
l = ['9/4/2013,00:00:00,7.8,7.4,9.53', '10/4/2013,00:00:00,8.64,7.4,9.53']
for t in l:
    print datetime.strptime(t,'%d/%m/%Y,%H:%M:%S'+t[t.index(',',t.index(',')+1):])

文字列に「%」が含まれる場合、空の文字列に置き換えることができます。

l = ['9/4/2013,00:00:00,7.8,7.4,9.53', '10/4/2013,00:00:00,8.64,7.4,9.53']
for t in l:
    t = t.replace('%','')
    fmt = '%d/%m/%Y,%H:%M:%S' + t[t.index(',',t.index(',')+1):]
    print datetime.strptime(t, fmt)

または、文字列スライスと静的フォーマット文字列を使用すると、

for t in l:
        print datetime.strptime(t[:t.find(',',t.find(',')+1)],'%d/%m/%Y,%H:%M:%S')

2013-04-09 00:00:00
2013-04-10 00:00:00

于 2015-03-26T20:31:31.043 に答える