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

时间:2014-10-02 12:47:33

标签: 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

毫秒在哪里?

3 个答案:

答案 0 :(得分: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)

您必须手动添加这些内容:

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

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

epoch = datetime.datetime.fromtimestamp(0)
(dt - epoch).total_seconds()

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

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

演示:

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

  

毫秒在哪里?

这很容易。 .timetuple()电话会删除它们。您可以使用.microsecond属性将其添加回来。 datetime.timestamp() method from the standard library适用于天真的日期时间对象:

def timestamp(self):
    "Return POSIX timestamp as float"
    if self._tzinfo is None:
        return _time.mktime((self.year, self.month, self.day,
                             self.hour, self.minute, self.second,
                             -1, -1, -1)) + self.microsecond / 1e6
    else:
        return (self - _EPOCH).total_seconds()

如果可能的话就足够了〜在你的情况下可以忽略1小时的错误。我假设你想要微秒,因此你不能无声地忽略~1小时的时间错误。

将作为字符串给出的本地时间正确转换为POSIX时间戳是一项复杂的任务。您可以将本地时间转换为UTC,然后转换为get the timestamp from UTC time

有两个主要问题:

两者都可以使用tz数据库(Python中的pytz模块)来解决:

from datetime import datetime
import pytz # $ pip install pytz
from tzlocal import get_localzone # $ pip install tzlocal

tz = get_localzone() # get pytz timezone corresponding to the local timezone

naive_d = datetime.strptime(myDate, "%Y-%m-%d %H:%M:%S,%f")
# a) raise exception for non-existent or ambiguous times
d = tz.localize(naive_d, is_dst=None)
## b) assume standard time, adjust non-existent times
#d = tz.normalize(tz.localize(naive_d, is_dst=False))
## c) assume DST is in effect, adjust non-existent times
#d = tz.normalize(tz.localize(naive_d, is_dst=True))
timestamp = d - datetime(1970, 1, 1, tzinfo=pytz.utc)

结果是timestamp - 一个timedelta对象,您可以将其转换为秒,毫秒等。

此外,不同的系统在闰秒期间/可能会有不同的行为。大多数应用程序可以忽略它们的存在。

通常,将POSIX时间戳另外存储到本地时间可能更简单,而不是尝试从本地时间猜测它。