Подтвердить что ты не робот

Разница дат в минутах в Python

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

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

Ответ 1

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

Ответ 2

Ответ на 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 дня; он игнорирует час, мин и секунду от timedelta.

Лучшим подходом было бы преобразование дат в общий формат и последующее вычисление. Самый простой способ сделать это - преобразовать их в метки времени 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

Ответ 3

minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0

Ответ 4

Если кто-то этого не осознает, один из способов сделать это - совместить ответы Кристофа и 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

Используйте datetime.strptime() для анализа в экземплярах datetime, а затем вычислите разницу и, наконец, преобразуйте разницу в минуты.

Ответ 6

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

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

Ответ 7

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

Простейший случай, если обе даты используют одно и то же смещение 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 в осведомленные объекты datetime, прежде чем находить разницу, принять с учетом возможных изменений смещения utc.

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

#!/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 для создания исключения для неоднозначных или несуществующих локальных времен.

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

Ответ 8

Как уже было сказано, вам нужно использовать метод 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

Ответ 9

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

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)

Спасибо

Ответ 10

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

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