Разница в минутах в Python - PullRequest
51 голосов
/ 07 мая 2010

Как рассчитать разницу во времени в минутах для следующей метки времени в Python?

2010-01-01 17:31:22
2010-01-03 17:31:22

Ответы [ 10 ]

87 голосов
/ 30 июля 2011

Ответ RSabet не работает в тех случаях, когда даты не имеют одинакового точного времени.

Исходная задача:

from datetime import datetime

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 17:31:22', fmt)

daysDiff = (d2-d1).days
print daysDiff
> 2

# Convert days to minutes
minutesDiff = daysDiff * 24 * 60

print minutesDiff
> 2880

d2-d1 дает вам datetime.timedelta, а когда вы используете дни, он показывает только дни в timedelta. В этом случае он работает нормально, но если у вас будет следующее.

from datetime import datetime

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 16:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)

daysDiff = (d2-d1).days
print daysDiff
> 2

# Convert days to minutes
minutesDiff = daysDiff * 24 * 60

print minutesDiff
> 2880  # that is wrong

Он все равно дал бы вам тот же ответ, поскольку он все еще возвращает 2 в течение нескольких дней; он игнорирует часы, минуты и секунды с момента времени.

Лучшим подходом было бы преобразовать даты в общий формат и затем выполнить расчет. Самый простой способ сделать это - преобразовать их в метки времени Unix. Вот код для этого.

from datetime import datetime
import time

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)

# Convert to Unix timestamp
d1_ts = time.mktime(d1.timetuple())
d2_ts = time.mktime(d2.timetuple())

# They are now in seconds, subtract and then divide by 60 to get minutes.
print int(d2_ts-d1_ts) / 60
> 3043  # Much better
68 голосов
/ 27 августа 2016
minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0
17 голосов
/ 21 апреля 2015

Если кто-то не осознает этого, один из способов сделать это - объединить ответы Кристофа и RSabet:

from datetime import datetime
import time

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)

diff = d2 -d1
diff_minutes = (diff.days * 24 * 60) + (diff.seconds/60)

print(diff_minutes)
> 3043
5 голосов
/ 07 мая 2010

Используйте <a href="http://docs.python.org/library/datetime.html#datetime.datetime.strptime" rel="noreferrer">datetime.strptime()</a>, чтобы проанализировать экземпляры datetime, а затем вычислить разницу и, наконец, преобразовать разницу в минуты.

3 голосов
/ 21 апреля 2015

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

Самый простой случай, если обе даты используют одинаковое смещение utc:

#!/usr/bin/env python3
from datetime import datetime, timedelta

time_format = "%Y-%d-%m %H:%M:%S"
dt1 = datetime.strptime("2010-01-01 17:31:22", time_format)
dt2 = datetime.strptime("2010-01-03 17:31:22", time_format)
print((dt2 - dt1) // timedelta(minutes=1)) # minutes

Если ваша версия Python не поддерживает td // timedelta; замените его на int(td.total_seconds() // 60).

Если входное время находится в местном часовом поясе, который может иметь различное смещение utc в разное время, например, оно имеет летнее время, тогда вы должны * dt1, dt2 включить в осведомленные объекты даты и времени, прежде чем найти разницу учитывать возможные изменения в смещении utc.

Переносимый способ создания локальных объектов даты и времени - это использование pytz часовых поясов:

#!/usr/bin/env python
from datetime import timedelta
import tzlocal # $ pip install tzlocal

local_tz = tzlocal.get_localzone() # get pytz timezone
aware_dt1, aware_dt2 = map(local_tz.localize, [dt1, dt2])
td  = aware_dt2 - aware_dt1 # elapsed time

Если либо dt1, либо dt2 соответствуют неоднозначному времени, тогда для устранения неоднозначности используется значение по умолчанию is_dst=False. Вместо этого вы можете установить is_dst=None, чтобы вызвать исключение для неоднозначных или несуществующих локальных времен.

Если вы не можете установить сторонние модули, то из ответа @Ken Cochrane можно использовать time.mktime(), который может найти правильное смещение utc на некоторых платформах для некоторых дат в некоторых часовых поясах - если вы не требуется согласованного (но, возможно, ошибочного) результата, тогда это гораздо лучше, чем делать dt2 - dt1 с наивными объектами datetime, которые всегда терпят неудачу, если соответствующие смещения utc различаются.

3 голосов
/ 04 января 2012

Для расчета с другой датой времени:

from datetime import datetime

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 16:31:22', fmt)
d2 = datetime.strptime('2010-01-03 20:15:14', fmt)

diff = d2-d1
diff_minutes = diff.seconds/60
0 голосов
/ 11 января 2019

есть также скрытый путь с пандами:

pd.to_timedelta(x) - pd.to_timedelta(y)

0 голосов
/ 09 февраля 2018

другими способами получить разницу между датами;

import dateutil.parser
import datetime

timeDifference = current_date - dateutil.parser.parse(last_sent_date)
time_difference_in_minutes = (int(timeDifference.days) * 24 * 60) + int((timeDifference.seconds) / 60)

Спасибо

0 голосов
/ 07 мая 2010

Как уже было сказано, вам нужно использовать datetime.datetime's strptime метод:

from datetime import datetime

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 17:31:22', fmt)

daysDiff = (d2-d1).days

# convert days to minutes
minutesDiff = daysDiff * 24 * 60

print minutesDiff
0 голосов
/ 07 мая 2010
from datetime import datetime

fmt = '%Y-%m-%d %H:%M:%S'
d1 = datetime.strptime('2010-01-01 17:31:22', fmt)
d2 = datetime.strptime('2010-01-03 17:31:22', fmt)

print (d2-d1).days * 24 * 60
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...