如何为Python中以下时间戳计算以分钟为单位的时间差?
2010-01-01 17:31:22
2010-01-03 17:31:22
不确定是否有可能,但是您应该更改接受的答案,因为您选择的答案在所有情况下均无效,并且可能会导致人员问题。
如果日期的确切时间不同,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
好答案@ken :)
这对我不起作用,我有两个通常相隔50-100秒的值,但是当我使用它时,它返回的值介于-17K到-18K之间。知道为什么会这样吗? (我使用的代码与编写的代码完全相同,只是给定的日期不同)。
time.mktime()可能会考虑某些平台上本地utc偏移量的变化(如果输入是不明确的本地时间(例如在DST结束过渡期间),它可能也会失败。为了在所有平台上获得一致的结果,可以使用pytz时区(例如tzlocal.get_localzone()调用返回)来识别日期时间对象-以获得正确的经过时间(忽略leap秒)。
谢谢,这非常有帮助。老实说,日期时间不是一个非常用户友好的模块
如果d1 = datetime.strptime(2010-01-01 17:31:22, fmt)和d2 = datetime.strptime(2010-01-01 18:31:22, fmt)给出0,则此操作将失败,因为没有任何日差,只有分钟差。
minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0
简单好回答; Id添加一个警告,它假定datetime_end和datetime_start已被解析为datetime对象。减法生成一个timedelta实例。
如果有人不知道,做到这一点的一种方法是将克里斯托弗和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
如果对应于d1的utc与d2的utc不同,则此方法失败。要考虑utc偏移量,请参阅@Ken Cochranes答案中的解决方案以及我的评论
使用datetime.strptime()解析为日期时间实例,然后计算差异,最后将差异转换为分钟。
结果取决于与输入时间字符串相对应的时区。
最简单的情况是两个日期都使用相同的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偏移量不同,该对象总是会失败。
阅读您的答案后,我明白了。太好了!
要使用其他时间日期进行计算:
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
此方法不正确,它忽略了天数差异。
熊猫还有一种偷偷摸摸的方法:
pd.to_timedelta(x) - pd.to_timedelta(y)
以其他方式获取日期之间的差异;
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)
谢谢
就像已经说过的那样,您需要使用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
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