254

我想要一个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
4

14 回答 14

495

要获取以毫秒为单位的日期字符串(秒后 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])
于 2013-08-23T15:20:33.483 回答
119

使用 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

于 2019-05-10T09:15:18.097 回答
29
print datetime.utcnow().strftime('%Y%m%d%H%M%S%f')

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

于 2011-09-28T19:35:58.963 回答
27

@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
于 2016-02-26T04:32:40.080 回答
7

大概是这样的:

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.
于 2013-12-04T16:50:19.150 回答
5
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
于 2016-10-06T08:15:40.463 回答
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
于 2011-09-28T20:33:58.517 回答
2

在 python 3.6 及更高版本中使用python f-strings

from datetime import datetime 

i = datetime.utcnow()

print(f"""{i:%Y-%m-%d %H:%M:%S}.{"{:03d}".format(i.microsecond // 1000)}""")

特定于格式毫秒的代码是:

{"{:03d}".format(i.microsecond // 1000)}

格式字符串{:03d}和微秒到毫秒// 1000的转换来自用于datetime.datetime.isoformat()def _format_timehttps://github.com/python/cpython/blob/master/Lib/datetime.py

于 2020-10-02T07:38:08.827 回答
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:]

使用translate()切片方法同时运行
translate()具有可在一行中使用的优点

在第一个的基础上比较时间:

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:]

于 2011-09-28T21:36:37.423 回答
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]
于 2015-07-28T22:37:23.047 回答
1
python -c "from datetime import datetime; print str(datetime.now())[:-3]"
2017-02-09 10:06:37.006
于 2017-02-09T18:09:05.070 回答
1
datetime
t = datetime.datetime.now()
ms = '%s.%i' % (t.strftime('%H:%M:%S'), t.microsecond/1000)
print(ms)
14:44:37.134
于 2019-03-05T14:45:28.157 回答
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"使用所需的小数位数动态构建。

于 2019-08-07T13:19:19.203 回答
0

如果您准备将时间存储在变量中并进行一些字符串操作,那么您实际上可以在不使用 datetime 模块的情况下执行此操作。

>>> _now = time.time()
>>> print ("Time : %s.%s\n" % (time.strftime('%x %X',time.localtime(_now)),
... str('%.3f'%_now).split('.')[1])) # Rounds to nearest millisecond
Time : 05/02/21 01:16:58.676

>>> 

%.3f 将四舍五入到最接近的毫秒,如果你想要更多或更少的精度,只需更改小数位数

>>> print ("Time : %s.%s\n" % (time.strftime('%x %X',time.localtime(_now)),
... str('%.1f'%_now).split('.')[1])) # Rounds to nearest tenth of a second
Time : 05/02/21 01:16:58.7

>>>

在 Python 2.7 和 3.7 中测试(显然,在 2.x 版本中调用 print 时需要省略括号)。

于 2021-05-02T00:26:02.117 回答