日時をミリ秒の文字列にフォーマットします


169

datetime日付からミリ秒の文字列が欲しい。このコードは私にとっては典型的なものであり、短縮する方法を学びたいと思っています。

from datetime import datetime

timeformatted= str(datetime.utcnow())
semiformatted= timeformatted.replace("-","")
almostformatted= semiformatted.replace(":","")
formatted=almostformatted.replace(".","")
withspacegoaway=formatted.replace(" ","")
formattedstripped=withspacegoaway.strip()
print formattedstripped


3
あなたの問題を説明するタイトルを書き、あなたの質問を明確かつ要点を保つようにしてください。
agf 2011

ここで言及する価値があるのは、追加の精度で十分な場合が多いことです。たとえば、Java Instant.parsestrftime('%Y-%m-%dT%H:%M:%S.%fZ')
JarekPrzygódzkiMar

回答:


353

ミリ秒(小数点以下3桁)の日付文字列を取得するには、次のようにします。

from datetime import datetime

print datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]

>>>> OUTPUT >>>>
2020-05-04 10:18:32.926

注:Python3の場合、print括弧が必要です。

print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])

1
正確に2013-08-23 10:18:32.926は、の出力ですprint datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
Jaan

3
あなたが使用したい場合は、import datetime代わりのをfrom datetime import datetime:あなたは、この使用する必要がありますdatetime.datetime.utcnow().strftime("%H:%M:%S.%f")
リュック

17
マイクロ秒が0の場合、Windows 2.7の実装ではマイクロ秒は出力されないため、秒をトリミングします:(
cabbi

8
これは切り捨てられ、ミリ秒に丸められないことに注意してください
Gens

2
gensが言及しているように、最初のドロップ数が> = 5である場合、これは間違いではありませんか?実際に、usec部分が999500より大きい場合、マイクロ秒部分をいじって時間を正しく調整することはできません
Chris

59

Python 3.6では、以下を使用できます。

from datetime import datetime
datetime.utcnow().isoformat(sep=' ', timespec='milliseconds')

出力:

'2019-05-10 09:08:53.155'

詳細はこちら:https : //docs.python.org/3/library/datetime.html#datetime.datetime.isoformat


タイムゾーンでも便利:date = datetime(2019,5,10)date_with_tz = pytz.timezone( 'Europe / Rome')。localize(date)date_with_tz.isoformat(sep = 'T'、timespec = 'milliseconds')output: '2019-05-10T00:00:00.000 + 02:00'
恵那

これは受け入れられるべき実際の解決策です。そして、isoformat()は、GPX形式へのエクスポートに必要なものです。
フィリップハッピー

22
print datetime.utcnow().strftime('%Y%m%d%H%M%S%f')

http://docs.python.org/library/datetime.html#strftime-strptime-behavior


13
参考までに、これは最後の6桁としてマイクロ秒を出力します。[:-3]最後に追加して、最後の3桁をドロップし、ミリ秒のみを表示するようにします。
Mark Lakata、2014年

5
マイクロ秒は6桁未満になる可能性があるため、[:-3]は誤ったミリ秒を出力しています
cabbi

13
タイムゾーンがある場合はどうなりますか?
ᐅdevrimbaris

1
タイムゾーンチェックアウト用の@ᐅdevrimbarisロレンツォの答え
Ena

17

@Cabbiは、一部のシステムではマイクロ秒形式で%fが発生する可能性があるという問題を提起した"0"ため、最後の3文字を単純に切り捨てることはできません。

次のコードは、ミリ秒でタイムスタンプを慎重にフォーマットします。

from datetime import datetime
(dt, micro) = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f').split('.')
dt = "%s.%03d" % (dt, int(micro) / 1000)
print dt

出力例:

2016-02-26 04:37:53.133

OPが必要とする正確な出力を取得するには、句読文字を取り除く必要があります。

from datetime import datetime
(dt, micro) = datetime.utcnow().strftime('%Y%m%d%H%M%S.%f').split('.')
dt = "%s%03d" % (dt, int(micro) / 1000)
print dt

出力例:

20160226043839901

6
私が実際にやっていることはこれです:print '%s。%03d'%(dt.strftime( "%Y-%m-%d%H:%M:%S")、int(dt.microsecond / 1000 ))
cabbi 2016年

2
@cabbiに同意します。stringとintを使用して前後に変換する必要はありません
caoanan '21年

ええ私も同意する... :)
サム・ワトキンス

1
この答えは、他の答えよりもはるかに正確で安全です。よろしくお願いします!
Hunaphu

5

おそらくこのように:

import datetime
now = datetime.datetime.now()
now.strftime('%Y/%m/%d %H:%M:%S.%f')[:-3]  
# [:-3] => Removing the 3 last characters as %f is for microsecs.

2番目は、月ではなく分であるため%m%Mでなければなりません。
マイケルドー

2

私は、あなたがdatetime.datetime.strftime()よりも高速なものを探していて、本質的に非アルファ文字をutcタイムスタンプから削除していることを意味していると思います。

あなたのアプローチはわずかに速く、文字列をスライスすることでさらにスピードアップできると思います:

>>> import timeit
>>> t=timeit.Timer('datetime.utcnow().strftime("%Y%m%d%H%M%S%f")','''
... from datetime import datetime''')
>>> t.timeit(number=10000000)
116.15451288223267

>>> def replaceutc(s):
...     return s\
...         .replace('-','') \
...         .replace(':','') \
...         .replace('.','') \
...         .replace(' ','') \
...         .strip()
... 
>>> t=timeit.Timer('replaceutc(str(datetime.datetime.utcnow()))','''
... from __main__ import replaceutc
... import datetime''')
>>> t.timeit(number=10000000)
77.96774983406067

>>> def sliceutc(s):
...     return s[:4] + s[5:7] + s[8:10] + s[11:13] + s[14:16] + s[17:19] + s[20:]
... 
>>> t=timeit.Timer('sliceutc(str(datetime.utcnow()))','''
... from __main__ import sliceutc
... from datetime import datetime''')
>>> t.timeit(number=10000000)
62.378515005111694

@oxtopusよくできました。個人的には、時間の単純な測定にtimeitを使用しなくなりました。あなたのコードで時間の比率が異なるのは奇妙です:
1-0.67-0.53

テストの反復ごとに呼び出されるstr(datetime.datetime.utcnow())と何か関係があるのでしょうか?
オースティンマーシャル

1
from datetime import datetime
from time import clock

t = datetime.utcnow()
print 't == %s    %s\n\n' % (t,type(t))

n = 100000

te = clock()
for i in xrange(1):
    t_stripped = t.strftime('%Y%m%d%H%M%S%f')
print clock()-te
print t_stripped," t.strftime('%Y%m%d%H%M%S%f')"

print

te = clock()
for i in xrange(1):
    t_stripped = str(t).replace('-','').replace(':','').replace('.','').replace(' ','')
print clock()-te
print t_stripped," str(t).replace('-','').replace(':','').replace('.','').replace(' ','')"

print

te = clock()
for i in xrange(n):
    t_stripped = str(t).translate(None,' -:.')
print clock()-te
print t_stripped," str(t).translate(None,' -:.')"

print

te = clock()
for i in xrange(n):
    s = str(t)
    t_stripped = s[:4] + s[5:7] + s[8:10] + s[11:13] + s[14:16] + s[17:19] + s[20:] 
print clock()-te
print t_stripped," s[:4] + s[5:7] + s[8:10] + s[11:13] + s[14:16] + s[17:19] + s[20:] "

結果

t == 2011-09-28 21:31:45.562000    <type 'datetime.datetime'>


3.33410112179
20110928212155046000  t.strftime('%Y%m%d%H%M%S%f')

1.17067364707
20110928212130453000 str(t).replace('-','').replace(':','').replace('.','').replace(' ','')

0.658806915404
20110928212130453000 str(t).translate(None,' -:.')

0.645189262881
20110928212130453000 s[:4] + s[5:7] + s[8:10] + s[11:13] + s[14:16] + s[17:19] + s[20:]

使用(変換)スライス同じ時間内のメソッドの実行が
(翻訳) 1行で使用できるように利点を提供します

最初のものに基づいて時間を比較する:

1.000 * t.strftime( '%Y%m%d%H%M%S%f')

0.351 * str(t).replace( '-'、 '')。replace( ':'、 '')。replace( '。'、 '')。replace( ''、 '')

0.198 * str(t).translate(なし、 '-:.')

0.194 * s [:4] + s [5:7] + s [8:10] + s [11:13] + s [14:16] + s [17:19] + s [20:]


1
いいね!それは確かにパフォーマンスを犠牲にすることなくきれいです。私のテストでは、str.translate()は実際には高速です。
オースティンマーシャル

1

私は同じ問題を扱いましたが、私の場合、ミリ秒が丸められ、切り捨てられないことが重要でした

from datetime import datetime, timedelta

def strftime_ms(datetime_obj):
    y,m,d,H,M,S = datetime_obj.timetuple()[:6]
    ms = timedelta(microseconds = round(datetime_obj.microsecond/1000.0)*1000)
    ms_date = datetime(y,m,d,H,M,S) + ms
    return ms_date.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]

1
import datetime

# convert string into date time format.

str_date = '2016-10-06 15:14:54.322989'
d_date = datetime.datetime.strptime(str_date , '%Y-%m-%d %H:%M:%S.%f')
print(d_date)
print(type(d_date)) # check d_date type.


# convert date time to regular format.

reg_format_date = d_date.strftime("%d %B %Y %I:%M:%S %p")
print(reg_format_date)

# some other date formats.
reg_format_date = d_date.strftime("%Y-%m-%d %I:%M:%S %p")
print(reg_format_date)
reg_format_date = d_date.strftime("%Y-%m-%d %H:%M:%S")
print(reg_format_date)

<<<<<<出力>>>>>>>

2016-10-06 15:14:54.322989    
<class 'datetime.datetime'>    
06 October 2016 03:14:54 PM    
2016-10-06 03:14:54 PM    
2016-10-06 15:14:54

1
python -c "from datetime import datetime; print str(datetime.now())[:-3]"
2017-02-09 10:06:37.006

0
datetime
t = datetime.datetime.now()
ms = '%s.%i' % (t.strftime('%H:%M:%S'), t.microsecond/1000)
print(ms)
14:44:37.134

0

datetime.utcnow()その他のそのようなソリューションの問題は、遅いことです。

より効率的なソリューションは次のようになります。

def _timestamp(prec=0):
    t = time.time()
    s = time.strftime("%H:%M:%S", time.localtime(t))
    if prec > 0:
        s += ("%.9f" % (t % 1,))[1:2+prec]
    return s

あなたの場合precはどこにいるのでしょうか3(ミリ秒)。

この関数は小数点以下9桁まで機能します(92番目のフォーマット文字列の番号に注意してください)。

小数部を丸める場合は"%.9f"、希望する小数点以下の桁数で動的に構築することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.