Nano Hash - криптовалюты, майнинг, программирование

Python 2.7 – как найти разницу между двумя временными метками datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S.%f') в секундах/микросекундах?

Я новичок в Python (2.7), и у меня есть две переменные, которые содержат временные метки — мне нужно найти разницу между ними в секундах/микросекундах.

Я потратил почти целый день, пытаясь понять, как это сделать, и зашел в тупик - так что не могли бы вы помочь указать мне правильное направление, пожалуйста, имейте в виду, что я новичок в python, поэтому мне нужно объяснить вещи просто.

Я искал Stackoverflow и не видел никаких вопросов/ответов, которые помогли бы мне решить эту проблему, а если и помогают, то я не понимаю, как... поскольку они либо используют разные версии python, либо работают с известными значениями временной метки, где переменные в мои генерируются во время работы программы...

Во-первых, я импортирую следующие модули для работы со значениями даты и времени:

from datetime import *
from time import *

Затем я получаю одно значение метки времени из сообщения amqp в формате posix (utc), поэтому я конвертирую его, используя:

== 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_timestamp и local_time, они выглядят точно так же с точки зрения форматирования...

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

если затем я попытаюсь вычесть две переменные друг из друга, чтобы увидеть разницу во времени между formatted_timestamp и local_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')

Имейте в виду, что я получаю t_timestamp из сообщения amqp (RabbitMQ) через pika и использую «split», чтобы назначить полученную временную метку utc epoc/posix переменной в моей программе, а затем работать с ней, как показано выше.

Я искал несколько часов, прежде чем опубликовать этот вопрос, но не нашел решения и не понял, почему я не могу этого сделать, учитывая, что операторы печати дают точно такие же результаты - любая помощь будет очень признательна - спасибо.


  • Возможный дубликат Как мне проверить разницу, в секундах между двумя датами? 04.11.2016
  • Вам нужно вычесть два объекта datetime, а не их строковые представления. Когда вы помещаете объект в print, он неявно вызывает str(obj), поэтому они печатают одно и то же. 04.11.2016
  • если у вас есть метки времени, сделайте timestamp1 - timestamp2, чтобы получить разницу в миллисекундах. Кстати: не конвертируйте объект datetime в string - сделайте datetime1 - datetime2. 04.11.2016
  • Да, принципиально, когда вы используете strftime, результат больше не является timestamp в том смысле, что это объект datetime. Это просто старая простая строка, не знающая дат и времени. 04.11.2016
  • спасибо всем - но @juanpa.arrivillaga, я думаю, вы помогли мне найти решение - я изменил код на 'ts = int(t_timestamp) tick_timestamp = datetime.fromtimestamp(ts / 1e3)', и теперь я могу вычесть временные метки - всем большое спасибо! 04.11.2016

Ответы:


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
03.11.2016
  • спасибо @ r0xette - я нашел простое решение, но я поэкспериментирую с тем, что вы ответили, так как это кажется более элегантным решением - спасибо! 04.11.2016
  • @TechnologySmiths. Пожалуйста, не стесняйтесь нажимать на стрелку, чтобы принять ответ, если он помог. Удачи. 04.11.2016
  • @ r0xette Боюсь, это не решение, так как это дает результат в виде печатной строки, и мне нужно работать с ней как с переменной формата datetime, чтобы я мог выполнять арифметические действия со значением - однако я ценю ваше время и усилия - спасибо. Решение, которое я нашел ниже, позволяет мне ссылаться на переменную tstamp_age в коде и работать с ней как со значением времени, тогда как предоставленное вами решение позволяет печатать эти значения только в виде строк, но, пожалуйста, простите меня, если Я что-то упускаю... 05.11.2016

  • 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 только в переменной, которая будет использоваться для сравнения.

    еще раз всем спасибо

    03.11.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..