time.strptimeで日付/時刻を含む文字列を解析できます
>>> import time
>>> time.strptime('30/03/09 16:31:32', '%d/%m/%y %H:%M:%S')
(2009, 3, 30, 16, 31, 32, 0, 89, -1)
ミリ秒を含む時間文字列を解析するにはどうすればよいですか?
>>> time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/_strptime.py", line 333, in strptime
data_string[found.end():])
ValueError: unconverted data remains: .123
Python 2.6は、マイクロ秒を実行する新しいstrftime/strptimeマクロ%f
を追加しました。これがどこかに文書化されているかどうかはわかりません。しかし、2.6または3.0を使用している場合、これを行うことができます。
time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
編集:time
モジュールを実際に使用したことはないので、最初はこれに気付きませんでしたが、time.struct_timeは実際にはミリ秒/マイクロ秒を保存しないようです。次のように、datetime
を使用した方が良い場合があります。
>>> from datetime import datetime
>>> a = datetime.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
>>> a.microsecond
123000
これは古い質問ですが、Python 2.4.3を使用しているため、データの文字列を日時に変換するより良い方法を見つける必要がありました。
Datetimeが%fをサポートせず、try/exceptを必要としない場合の解決策は次のとおりです。
(dt, mSecs) = row[5].strip().split(".")
dt = datetime.datetime(*time.strptime(dt, "%Y-%m-%d %H:%M:%S")[0:6])
mSeconds = datetime.timedelta(microseconds = int(mSecs))
fullDateTime = dt + mSeconds
これは、入力文字列「2010-10-06 09:42:52.266000」に対して機能します
nstehr's answer が参照するコードを提供するには(from from its source ):
def timeparse(t, format):
"""Parse a time string that might contain fractions of a second.
Fractional seconds are supported using a fragile, miserable hack.
Given a time string like '02:03:04.234234' and a format string of
'%H:%M:%S', time.strptime() will raise a ValueError with this
message: 'unconverted data remains: .234234'. If %S is in the
format string and the ValueError matches as above, a datetime
object will be created from the part that matches and the
microseconds in the time string.
"""
try:
return datetime.datetime(*time.strptime(t, format)[0:6]).time()
except ValueError, msg:
if "%S" in format:
msg = str(msg)
mat = re.match(r"unconverted data remains:"
" \.([0-9]{1,6})$", msg)
if mat is not None:
# fractional seconds are present - this is the style
# used by datetime's isoformat() method
frac = "." + mat.group(1)
t = t[:-len(frac)]
t = datetime.datetime(*time.strptime(t, format)[0:6])
microsecond = int(float(frac)*1e6)
return t.replace(microsecond=microsecond)
else:
mat = re.match(r"unconverted data remains:"
" \,([0-9]{3,3})$", msg)
if mat is not None:
# fractional seconds are present - this is the style
# used by the logging module
frac = "." + mat.group(1)
t = t[:-len(frac)]
t = datetime.datetime(*time.strptime(t, format)[0:6])
microsecond = int(float(frac)*1e6)
return t.replace(microsecond=microsecond)
raise
python 2の場合、これを行いました
print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1])
時間 "%H:%M:%S"を出力し、time.time()を2つの部分文字列(。の前後)xxxxxxx.xxに分割します。xxはミリ秒なので、2番目の部分文字列を "% H:%M:%S "
それが理にかなっていることを願っています:)出力例:
13:31:21.72点滅01
13:31:21.81点滅終了01
13:31:26.3点滅01
13:31:26.39点滅終了01
13:31:34.65開始レーン01
私の最初の考えは、「30/03/09 16:31:32.123」(秒とミリ秒の間にコロンではなくピリオドを使用)を渡すことでした。しかし、それはうまくいきませんでした。ドキュメントを一目見れば、どんな場合でも秒の小数部は無視されることがわかります...
ああ、バージョンの違い。これは バグとして報告された でしたが、現在2.6以降では「%S.%f」を使用して解析できます。
pythonメーリングリストから: ミリ秒スレッドの解析 。著者のコメントで述べたように、それはハッキングのようなものですが、そこに投稿された機能は仕事を終わらせるようです。正規表現を使用して、発生した例外を処理し、いくつかの計算を行います。
Strptimeに渡す前に、正規表現と計算を事前に試すこともできます。