Как рассчитать разницу во времени в минутах для следующей метки времени в Python?
2010-01-01 17:31:22
2010-01-03 17:31:22
Как рассчитать разницу во времени в минутах для следующей метки времени в Python?
2010-01-01 17:31:22
2010-01-03 17:31:22
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
Ответ на 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
minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0
Если кто-то этого не осознает, один из способов сделать это - совместить ответы Кристофа и 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
Используйте datetime.strptime()
для анализа в экземплярах datetime, а затем вычислите разницу и, наконец, преобразуйте разницу в минуты.
Для расчета с другой датой времени:
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
Результат зависит от часового пояса, который соответствует строкам входного времени.
Простейший случай, если обе даты используют одно и то же смещение 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 различны.
Как уже было сказано, вам нужно использовать метод 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
Другими способами получить разницу между датами;
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)
Спасибо
Существует также скрытый путь с пандами:
pd.to_timedelta(x) - pd.to_timedelta(y)