2015-01-21 2 views
-1

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

Я попытался следующие:

d1 = datetime.datetime(2015, 1, 21, 9, 54, 54, 340000) 
print d1 
d2 = datetime.datetime.now() 
print d2 
print d2 - d1 
d3 =datetime.datetime.strptime("22:17:46.476000","%H:%M:%S.%f") 
print d3 

Выход вышеуказанной программы:

2015-01-21 09:54:54.340000 
2015-01-21 22:28:45.070000 
12:33:50.730000 
1900-01-01 22:17:46.476000 

Здесь разница во времени 12: 33: 50,730000' и я хочу, чтобы сравнить его с '22 : 17: 46.476000 ', который является строкой.

Как я пытался преобразовать строку '22: 17: 46.476000 'в то время, когда я получил год в 1990 году. Я хочу только время, как '22: 17: 46.476000'. Поэтому я могу сравнить эти два раза с помощью timedelta.

Как избавиться от года 1990-01-01. Я хочу только «22: 17: 46.476000».

Я пытался использовать время, как time.strptime("22:17:46.476000","%H:%M:%S.%f") но он дает выход в time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=22, tm_min=17, tm_sec=46, tm_wday=0, tm_yday=1, tm_isdst=-1)

Благодарности

+0

Чтобы правильно вычислить прошедшее время, вам также необходимо учитывать местный часовой пояс. В частности, вы должны * не * подструктурировать из 'datetime.now()' value - часто это ошибка, см. [Найти, прошло ли 24 часа между датами - Python] (http://stackoverflow.com/a/ 26313848/4279). – jfs

ответ

1

В его нынешнем виде вы сравниваете двух принципиально разных великих людей.

Когда вы вычитаете один объект Datetime из другого, вы получаете объект timedelta - это период времени, который может быть выражен в днях, часах, секундах или в любой временной единице.

Объекты Datetime, с другой стороны, отмечают определенный момент времени. Когда вы анализируете строку времени только для Datetime, поскольку не указан год, месяц или день, они получают значения по умолчанию 1900-01-01.

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

Самый простой способ сделать это с того места, где вы находитесь, - это вычесть из вашего проанализированного объекта в полночь 1900-01-01 - и тогда у вас есть объект timedelta с такой продолжительностью. Однако обратите внимание, что это взломать, и как только временной интервал, который вам нужно проанализировать, больше 24 часов, он сломается (strptime, конечно же, не будет анализировать «30:15: ...» как 6-й час 1901 года -01-02)

Таким образом, вы бы лучше разбить на части и построить timedelta объект с нуля для вашей строки:

hour, min, sec = "22:17:46.476000".split(":") 
d3 = datetime.timedelta(hours=int(hour), minutes=int(minutes), seconds=float(sec)) 
0

Предоставлено Задан d3, вы можете получить время (без даты), используя time метод:

>>> d3.time() 
datetime.time(22, 17, 46, 476000) 

Затем вы можете сравнить это время с d2.time():

>>> d2.time() > d3.time() 
False 

В качестве альтернативы можно использовать combine построить DateTime из 's даты и d3' d2 времени s:

import datetime as DT 
d1 = DT.datetime(2015, 1, 21, 9, 54, 54, 340000) 
d2 = DT.datetime.now() 
d3 = DT.datetime.strptime("22:17:46.476000","%H:%M:%S.%f") 
d3 = DT.datetime.combine(d2.date(), d3.time()) 
print(d3) 
# 2015-01-21 22:17:46.476000 

Вы можете сравнить два DateTimes: d2 и d3. Например:

>>> d2 < d3 
True 

>>> (d3-d2).total_seconds() 
36664.503375 
+0

Я поддержал это. Тот, кто его ниспровергает, не понимает модуль [datetime] (https://docs.python.org/2/library/datetime.html). –

+0

Этот ответ имеет серьезные логические проблемы. O.P. задает вопрос о сравнении временных интервалов - и разбор его строки сравнения, поскольку сбор муравьев datetime только временная часть явно ошибочна. Это может случиться, случайно, до момента, когда его интервал составляет> = 24 часа. – jsbueno

+1

ОП спрашивает: «Я хочу только время как« 22: 17: 46.476000 ». Поэтому я могу сравнить эти два раза с помощью timedelta.» *. Это означает, что '22: 17: 46.476000'' представляет собой строковое представление времени, а не timedelta. – unutbu

0

Разница между двумя datetime с является длительность представлена ​​в виде datetime.timedelta и не datetime, так что вы не можете отформатировать его с помощью strftime.

Вместо того, чтобы использовать strptime для анализа вашего значения для d3, вы должны непосредственно построить datetime.timedelta. См. documentation for its constructor.

Если вам действительно нужно разобрать d3 из строки, вы можете либо выполнить синтаксический анализ самостоятельно, либо использовать пакет python-dateutil.

0

Если я вас правильно понял, 22:17:46.476000 не представляет время, но (потому что вы хотите сравнить его с другой временной дельта).

Если это так, то вам действительно нужно построить объект datetime.timedelta из вашей строки. К сожалению, похоже, что нет встроенного способа сделать это, однако here вы можете найти некоторые рецепты.

Смежные вопросы