【问题标题】:Python 2.7 - how can I find the difference between two datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S.%f') timestamps in seconds/microseconds?Python 2.7 - 如何以秒/微秒为单位找到两个 datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S.%f') 时间戳之间的差异?
【发布时间】:2016-11-03 21:33:55
【问题描述】:

我是 python (2.7) 新手,我有两个包含时间戳的变量 - 我需要以秒/微秒为单位找出它们之间的差异。

我花了将近一整天的时间试图弄清楚如何做到这一点并且被难住了 - 所以你能帮我指出正确的方向吗,请记住我是 python 新手,所以我需要简单解释一下.

我已经搜索了 Stackoverflow,但没有看到任何可以帮助我解决此问题的问题/答案,或者如果他们这样做了,我不明白如何......因为他们要么使用不同版本的 python,要么使用已知的时间戳值,其中我的变量是在程序运行时生成的......

首先,我导入以下模块来处理日期和时间值:

from datetime import *
from time import *

然后我从一条 posix (utc) 格式的 amqp 消息中收到一个时间戳值,因此我使用以下方法对其进行转换:

== t_timestamp is acquired from an amqp message== 
ts = int(t_timestamp) / 1000.0
formatted_timestamp = datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S.%f')

然后我将本地系统时间分配给一个变量并将其转换为与上面相同的格式:

local_time = datetime.utcnow()
local_time = datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S.%f')

如果我打印 formatted_timestamplocal_time 变量,它们在格式方面看起来完全一样...

2016-11-03 21:05:37.512000 and 2016-11-03 21:05:38.045000 

如果我然后尝试将这两个变量相减,以便我可以查看 formatted_timestamplocal_time 之间的时间差(以秒/微秒为单位),如下所示:

tstamp_age = (local_time - formatted_timestamp)

我收到以下错误:

TypeError: unsupported operand type(s) for -: 'str' and 'str'

如果我不转换 local_time 时间戳,我会收到以下错误

TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'str'

但奇怪的是,如果我打印这两个变量,我会得到相同格式的时间戳,如下所示:

2016-11-03 21:12:08.319000 and 2016-11-03 21:12:12.299000

所以我想我的问题是 - 我怎样才能减去两个 str 格式化日期或将格式如下所示的时间戳转换为 datetime 类型,以便我可以在减法运算中使用它以秒\微秒为单位显示余数?

== t_timestamp is acquired from an amqp message== 
ts = int(t_timestamp) / 1000.0
formatted_timestamp = datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S.%f')

请记住,我通过 pika 从 amqp (RabbitMQ) 消息接收 t_timestamp,我使用“split”将接收到的 utc epoc/posix 时间戳分配给我的程序中的一个变量,然后使用它直接显示以上。

鉴于打印语句产生完全相同的结果 - 任何帮助将不胜感激 - 谢谢。

强>

【问题讨论】:

  • 您需要减去两个 datetime 对象,而不是它们的字符串表示形式。当您将对象放入 print 时,它会隐式调用 str(obj),这就是它们打印相同的原因。
  • 如果您有时间戳,请执行 timestamp1 - timestamp2 以获取以毫秒为单位的差异。顺便说一句:不要将对象 datetime 转换为 string - 做 datetime1 - datetime2
  • 是的,基本上,当您使用strftime 时,结果不再是timestamp,因为它是datetime 对象。它只是一个不知道日期和时间的普通字符串。
  • 感谢所有人 - 但@juanpa.arrivillaga,我想你可能已经帮我找到了解决方案 - 我将代码更改为 'ts = int(t_timestamp) tick_timestamp = datetime.fromtimestamp(ts / 1e3 )' 我现在可以减去时间戳 - 非常感谢大家!

标签: python python-2.7 datetime math timestamp


【解决方案1】:

python3.5 中的替代解决方案

#!/usr/bin/env python3
import datetime as dt

t1 = dt.datetime.strptime("2016-11-03 21:12:08.319000", "%Y-%m-%d %H:%M:%S.%f")
t2 = dt.datetime.strptime("2016-11-03 21:12:12.299000", "%Y-%m-%d %H:%M:%S.%f")

delta = t2 - t1
print("Time difference: {}".format(delta))
print("Seconds: {}".format(delta.seconds))
print("Microseconds: {}".format(delta.microseconds))

输出

Time difference: 0:00:03.980000
Seconds: 3
Microseconds: 980000

【讨论】:

  • 谢谢@r0xette - 我找到了一个简单的解决方案,但我会尝试你回复的内容,因为这似乎是一个更优雅的解决方案 - 谢谢!
  • @TechnologySmiths。如果有帮助,请随时单击箭头接受答案。祝你好运。
  • @r0xette 恐怕这不是解决方案,因为这会将结果作为打印字符串提供,我需要将其作为日期时间格式的变量使用,以便我可以使用价值——不过我很感谢你的时间和精力——谢谢。我在下面找到的解决方案允许我在代码中引用 tstamp_age 变量并将其作为时间值使用,因为您提供的解决方案仅允许将这些值打印为字符串 - 但请原谅我我错过了一些东西......
【解决方案2】:

感谢那些评论或发布答案的人,但是 juanpa.arrivillaga 评论的东西让我思考,所以我进行了搜索并最终更改了代码,如下所示,我现在可以做需要的事情 - 非常感谢所有人 - 我在您的帮助下能够很快解决这个问题!

== t_timestamp is acquired from an amqp message== 
`ts = int(t_timestamp)
tick_timestamp = datetime.fromtimestamp(ts / 1e3)

local_time = datetime.utcnow()

tstamp_age = (local_time - tick_timestamp)

现在打印为

 21:59:57.001000 1478210397001 0:00:00.060000

这对我来说很好,因为我只想将 tstamp_age 存储在一个变量中以用作比较。

再次感谢大家

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多