날짜 시간을 밀리 초 단위로 문자열로 형식화


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

여분의 정밀도는 종종 괜찮습니다. 예를 들어, Java Instant.parse는 다음과 같이 작성된 표현을 구문 분석 할 수 있습니다.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
Jarek Przygódzki

답변:


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")
Luc

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') 출력 : '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

5
마이크로 그래서 이하 6 자리 될 수있다 : 27] 잘못된 밀리 프린트 아웃된다
cabbi을

13
시간대가 있으면 어떻게 되나요?
ᐅ devrimbaris

1
시간대 체크 아웃을위한 @ ᐅ devrimbaris Lorenzo의 답변
Ena

17

@Cabbi는 일부 시스템에서 마이크로 초 형식 %f이 제공 할 수 있는 문제를 제기 했으므로 "0"마지막 세 문자 만 잘라내는 것은 이식성이 없습니다.

다음 코드는 밀리 초로 타임 스탬프의 형식을 신중하게 지정합니다.

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

2
@cabbi에 동의하면 string 및 int로 앞뒤로 변환 할 필요가 없습니다.
caoanan

그래 나도 동의 해 ... :)
Sam Watkins

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.

두 번째 %m%M월이 아닌 분이므로 이어야합니다 .
Michael Dorner

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을 사용하지 않습니다 . 0.53 및 광산과 - 0.67-1 : : 1 - 0.35-0.20를, 방법 것은 시간의 비율이 코드와 다른 것이 이상하다 의 strftime - 교체 - 슬라이스
eyquem

어쩌면 테스트를 반복 할 때마다 str (datetime.datetime.utcnow ())이 호출되는 것과 관련이 있습니까?
Austin Marshall

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.000 * t.strftime ( '% Y % m % d % H % M % S % f')

0.351 * str (t) .replace ( '-', ''). replace ( ':', ''). replace ( '.', ''). replace ( '', '')

0.198 * str (t). 번역 (없음, '-:.')

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


1
좋은! 성능을 저하시키지 않으면 서 실제로 더 깨끗합니다. str.translate () 실제로 테스트에서 더 빠릅니다.
Austin Marshall

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 자리까지 작동합니다 ( 9두 번째 형식 문자열의 숫자를 참고하십시오 ).

소수 부분을 반올림하려면 "%.9f"원하는 소수 자릿수로 동적으로 작성하는 것이 좋습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.