将Python的日期时间转换为毫秒级时间戳

92

如何将可读的时间(例如20.12.2016 09:38:42,76)转换为毫秒级的Unix时间戳?


1
你需要为 datetime.datetime.strptime 提供一个适当的格式字符串。请参阅文档 - a_guest
7个回答

128
在Python 3中,这可以分为两个步骤完成:
  1. 将时间字符串转换为datetime对象
  2. datetime对象的时间戳乘以1000,将其转换为毫秒。
例如像这样:
from datetime import datetime

dt_obj = datetime.strptime('20.12.2016 09:38:42,76',
                           '%d.%m.%Y %H:%M:%S,%f')
millisec = dt_obj.timestamp() * 1000

print(millisec)

输出:

1482223122760.0
strptime接受你的时间字符串和一个格式字符串作为输入。时间字符串(第一个参数)指定了你想要转换为datetime对象的内容。格式字符串(第二个参数)指定了你传递的字符串的实际格式。以下是来自官方文档的格式说明:
  • %d - 月份中的日期,用零填充。
  • %m - 月份,用零填充。
  • %Y - 带有世纪的年份,用十进制表示。
  • %H - 小时(24小时制),用零填充。
  • %M - 分钟,用零填充。
  • %S - 秒,用零填充。
  • %f - 微秒,用小数表示,补零至6位。

1
嘿,谢谢。不幸的是我得到了错误信息“AttributeError:'datetime.datetime'对象没有'timestamp'属性”。可能是因为我正在使用Python 2.7? - Tom
1
使用MYGz的答案适用于Python 2.7。 - Milo

31

对于那些在不解析和浪费毫秒的情况下寻找答案的人,假设dt_obj是一个日期时间对象:

仅适用于Python3,优雅

int(dt_obj.timestamp() * 1000)

同时兼容Python2和Python3:

import time

int(time.mktime(dt_obj.utctimetuple()) * 1000 + dt_obj.microsecond / 1000)

14

对于Python2.7-修改MYGz的答案以不剥离毫秒:

from datetime import datetime

d = datetime.strptime("20.12.2016 09:38:42,76", "%d.%m.%Y %H:%M:%S,%f").strftime('%s.%f')
d_in_ms = int(float(d)*1000)
print(d_in_ms)

print(datetime.fromtimestamp(float(d)))

输出:

1482248322760
2016-12-20 09:38:42.760000

7
你需要使用 strptime 解析你的时间格式。
>>> import time
>>> from datetime import datetime
>>> ts, ms = '20.12.2016 09:38:42,76'.split(',')
>>> ts
'20.12.2016 09:38:42'
>>> ms
'76'
>>> dt = datetime.strptime(ts, '%d.%m.%Y %H:%M:%S')
>>> time.mktime(dt.timetuple())*1000 + int(ms)*10
1482223122760.0

4

对于Python2.7版本

您可以将其格式化为秒,然后乘以1000转换为毫秒。

from datetime import datetime

d = datetime.strptime("20.12.2016 09:38:42,76", "%d.%m.%Y %H:%M:%S,%f").strftime('%s')
d_in_ms = int(d)*1000
print(d_in_ms)

print(datetime.fromtimestamp(float(d)))

输出:

1482206922000
2016-12-20 09:38:42

2
嘿,谢谢!我复制粘贴了你的代码,但出现了“ValueError: Invalid format string”错误。 - Tom
@Tom Python 版本是多少?在 Python2.7.6 上运行正常。 - Mohammad Yusuf
我正在使用Python 2.7.12。 - Tom
1
感谢您提供关于 Python 2.7 的答案。 - weefwefwqg3
它将忽略字符串中的毫秒,并且不会解决问题。 - PageNotFound
显示剩余2条评论

2

这是一个关于将Python datetime转换为时间戳的简单解决方案(如标题所示)。如果您的输入是字符串,则使用datetime.strptime将其转换为datetime对象。

from datetime import datetime
dt_obj = datetime.utcnow()  # input datetime object

毫秒

int(float(dt_obj.strftime('%s.%f')) * 1e3)

1656096296215

微秒

int(float(dt_obj.strftime('%s.%f')) * 1e6)

1656096296215242

2
很多答案没有保留日期时间的毫秒。这个方法适用于我:
def datetime_to_ms_epoch(dt):
    microseconds = time.mktime(dt.timetuple()) * 1000000 + dt.microsecond
    return int(round(microseconds / float(1000)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接