69

現在、私はログに記録しており、カスタムで独自のフォーマッターを使用していますformatTime():

def formatTime(self, _record, _datefmt):
    t = datetime.datetime.now()
    return t.strftime('%Y-%m-%d %H:%M:%S.%f')

私の問題は、マイクロ秒%fが 6 桁であることです。マイクロ秒の最初の 3 桁のように、桁数を減らす方法はありますか?

4

11 に答える 11

93

最も簡単な方法は、スライスを使用して、マイクロ秒の最後の 3 桁を切り取ることです。

def format_time():
    t = datetime.datetime.now()
    s = t.strftime('%Y-%m-%d %H:%M:%S.%f')
    return s[:-3]

チョップだけを強くお勧めします。タイムスタンプを切り刻むのではなく丸めるロギング コードを書いたことがありますが、丸めによって最後の桁が変更されると、実際にはやや混乱することがわかりました。特定のタイムスタンプで実行を停止した時限コードがありましたが、丸めのためにそのタイムスタンプのログ イベントがありました。チョップするだけで、よりシンプルで予測しやすくなります。

切り刻むだけでなく、実際に数値を丸めたい場合は、もう少し手間がかかりますが、恐ろしいことではありません。

def format_time():
    t = datetime.datetime.now()
    s = t.strftime('%Y-%m-%d %H:%M:%S.%f')
    head = s[:-7] # everything up to the '.'
    tail = s[-7:] # the '.' and the 6 digits after it
    f = float(tail)
    temp = "{:.03f}".format(f)  # for Python 2.x: temp = "%.3f" % f
    new_tail = temp[1:] # temp[0] is always '0'; get rid of it
    return head + new_tail

明らかに、より少ない変数で上記を単純化できます。とても簡単にフォローできるようにしたかっただけです。

于 2012-06-14T19:42:57.467 に答える
1

このメソッドは柔軟な精度を可能にし、大きすぎる精度を指定すると、マイクロ秒の値全体を消費します。

def formatTime(self, _record, _datefmt, precision=3):
    dt = datetime.datetime.now()
    us = str(dt.microsecond)
    f = us[:precision] if len(us) > precision else us
    return "%d-%d-%d %d:%d:%d.%d" % (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, int(f))

このメソッドは、小数点以下 3 桁までの丸めを実装します。

import datetime
from decimal import *

def formatTime(self, _record, _datefmt, precision='0.001'):
    dt = datetime.datetime.now()
    seconds = float("%d.%d" % (dt.second, dt.microsecond))
    return "%d-%d-%d %d:%d:%s" % (dt.year, dt.month, dt.day, dt.hour, dt.minute,
                             float(Decimal(seconds).quantize(Decimal(precision), rounding=ROUND_HALF_UP)))

完全にシリアル化された日時オブジェクトを再検証せずに変更したくないstrftimeため、このメソッドを意図的に使用することは避けました。この方法では、さらに変更したい場合に備えて、日付の内部も表示されます。

Decimal丸めの例では、精度がモジュールの文字列ベースであることに注意してください。

于 2015-04-13T00:12:15.397 に答える