Python:将字符串转换为时间戳,以微秒为单位

Kri*_*lin 11 python datetime timestamp converter

我想将字符串日期格式转换为微秒的时间戳我尝试以下但不给出预期的结果:

"""input string date -> 2014-08-01 04:41:52,117
expected result -> 1410748201.117"""

import time
import datetime

myDate = "2014-08-01 04:41:52,117"
timestamp = time.mktime(datetime.datetime.strptime(myDate, "%Y-%m-%d %H:%M:%S,%f").timetuple())

print timestamp
> 1410748201.0
Run Code Online (Sandbox Code Playgroud)

毫秒在哪里?

Mar*_*ers 13

时间元组中的微秒组件没有插槽:

>>> import time
>>> import datetime
>>> myDate = "2014-08-01 04:41:52,117"
>>> datetime.datetime.strptime(myDate, "%Y-%m-%d %H:%M:%S,%f").timetuple()
time.struct_time(tm_year=2014, tm_mon=8, tm_mday=1, tm_hour=4, tm_min=41, tm_sec=52, tm_wday=4, tm_yday=213, tm_isdst=-1)
Run Code Online (Sandbox Code Playgroud)

你必须手动添加它们:

>>> dt = datetime.datetime.strptime(myDate, "%Y-%m-%d %H:%M:%S,%f")
>>> time.mktime(dt.timetuple()) + (dt.microsecond / 1000000.0)
1406864512.117
Run Code Online (Sandbox Code Playgroud)

您可以遵循的另一种方法是生成相对于纪元的timedelta()对象,然后使用该timedelta.total_seconds()方法获取时间戳:

epoch = datetime.datetime.fromtimestamp(0)
(dt - epoch).total_seconds()
Run Code Online (Sandbox Code Playgroud)

使用本地时间纪元是非常慎重的,因为你有一个天真的(不是时区感知的)日期时间值.根据当地时区的历史记录,此方法可能不准确,请参阅JF Sebastian的评论.在减去时区感知时期之前,您必须先使用当地时区将天真日期时间值转换为时区感知日期时间值.

因此,更容易坚持timetuple()+微秒方法.

演示:

>>> dt = datetime.datetime.strptime(myDate, "%Y-%m-%d %H:%M:%S,%f")
>>> epoch = datetime.datetime.fromtimestamp(0)
>>> (dt - epoch).total_seconds()
1406864512.117
Run Code Online (Sandbox Code Playgroud)


use*_*153 6

在 Python 3.4 及更高版本中,您可以使用

timestamp = datetime.datetime.strptime(myDate, "%Y-%m-%d %H:%M:%S,%f").timestamp()
Run Code Online (Sandbox Code Playgroud)

这不需要导入time模块。它还使用更少的步骤,因此应该更快。对于旧版本的 python,其他提供的答案可能是您的最佳选择。

但是,生成的时间戳将以本地时间而不是 UTC 解释 myDate,如果 myDate 以 UTC 形式给出,则可能会导致问题