Python中的分钟日期差异

时间:2010-05-07 13:29:08

标签: python datetime

如何计算Python中以下时间戳的时间差(以分钟为单位)?

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

11 个答案:

答案 0 :(得分:85)

RSabet's answer在日期不具有相同确切时间的情况下不起作用。

原始问题:

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

答案 1 :(得分:63)

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

答案 2 :(得分:17)

如果有人没有意识到这一点,那么一种方法就是将Christophe和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

答案 3 :(得分:6)

使用datetime.strptime()解析日期时间实例,然后计算差异,最后将差异转换为分钟。

答案 4 :(得分:2)

使用不同的时间日期计算:

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

答案 5 :(得分:2)

结果取决于与输入时间字符串对应的时区。

如果两个日期使用相同的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偏移量,例如,它具有夏令时,那么您应该在找到之前将dt1dt2设置为识别日期时间对象差异,考虑到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

如果dt1dt2对应模糊时间,则默认is_dst=False用于消除歧义。您可以将is_dst=None设置为针对模糊或不存在的本地时间引发异常。

如果您无法安装第三方模块,那么time.mktime() could be used from @Ken Cochrane's answer可以在某些时区的某些日期在某些平台上找到正确的utc偏移量 - 如果您不需要一致(但可能是错误的)结果然后,如果相应的utc偏移量不同,那么使用天真的日期时间对象执行dt2 - dt1会好得多。

答案 6 :(得分:0)

正如已经说过的那样,你需要使用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

答案 7 :(得分:0)

以其他方式区分日期;

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)

由于

答案 8 :(得分:0)

还有熊猫偷偷摸摸的方式:

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

答案 9 :(得分:0)

如果您要查找pandas列中的时间戳之间的差异,则答案非常简单。 如果您需要几天或几秒钟,那么

# For difference in days:
df['diff_in_days']=(df['timestamp2'] - df['timestamp1']).dt.days
# For difference in seconds
df['diff_in_seconds']=(df['timestamp2'] - df['timestamp1']).dt.seconds

现在分钟很棘手,因为dt.minute仅在datetime64 [ns] dtype上有效。 而通过减去两个日期时间生成的列的格式为

AttributeError: 'TimedeltaProperties' object has no attribute 'm8'

因此,正如上面许多人提到的那样,您必须要做的是获得分钟差的实际值:

df['diff_in_min']=df['diff_in_seconds']/60

但是,如果只是想要两个时间戳记的分钟部分之间的差异,请执行以下操作

#convert the timedelta to datetime and then extract minute
df['diff_in_min']=(pd.to_datetime(df['timestamp2']-df['timestamp1'])).dt.minute

您还可以阅读文章https://docs.python.org/3.4/library/datetime.html 并参阅第8.1.2节,您将看到只读属性仅为秒,天和毫秒。这解决了分钟功能无法直接运行的原因。

答案 10 :(得分:-10)

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