如何最快地计算出两个日期之间经过了多少完整的天数?以下是我目前正在使用的方法。
math.floor((b - a).total_seconds()/float(86400))
如何最快地计算出两个日期之间经过了多少完整的天数?以下是我目前正在使用的方法。
math.floor((b - a).total_seconds()/float(86400))
假设您确实有两个日期对象,您可以将一个日期对象从另一个日期对象中减去,并查询生成的timedelta
对象中的天数:
>>> from datetime import date
>>> a = date(2011,11,24)
>>> b = date(2011,11,17)
>>> a-b
datetime.timedelta(7)
>>> (a-b).days
7
而且它也适用于日期时间——我认为它会向下舍入到最接近的一天:
>>> from datetime import datetime
>>> a = datetime(2011,11,24,0,0,0)
>>> b = datetime(2011,11,17,23,59,59)
>>> a-b
datetime.timedelta(6, 1)
>>> (a-b).days
6
timedelta
不会报告超过天数的任何单位(尽管我可能错了)。 - Paul D. Waitetimedelta
返回了0,这不是我想要的。我正在寻找日期差异。作为解决方案,我将datetime转换为date,它按照我期望的方式工作! - ftoyoshima您是指完整的日历天数,还是24小时的时间段?
如果只是24小时,假设您正在使用Python的datetime,则timedelta对象已经有一个days属性:timedelta
days = (a - b).days
对于日历天数,您需要将a向下取整到最近的一天,将b向上取整到最近的一天,并消除两端的不完整天数:
roundedA = a.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
roundedB = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
days = (roundedA - roundedB).days
a
向下取整,将 b
向上取整 => 对于向上取整的 b
,我们需要添加 timedelta(days=1) 是吗?roundedB = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
将 B
向下取整。roundedB = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0) + datetime.timedelta(days=1)
将 b
向上取整。 - avmohan尝试:
(b-a).days
我尝试使用类型为datetime.date
的b和a。
参考我对其他答案的评论,这是我基于24小时和日历天数计算天数差异的方法。对于24小时来说,"days"属性效果很好,而对于日历检查,函数效果最佳。
from datetime import timedelta, datetime
def cal_days_diff(a,b):
A = a.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
B = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
return (A - B).days
if __name__ == '__main__':
x = datetime(2013, 06, 18, 16, 00)
y = datetime(2013, 06, 19, 2, 00)
print (y - x).days # 0
print cal_days_diff(y, x) # 1
z = datetime(2013, 06, 20, 2, 00)
print (z - x).days # 1
print cal_days_diff(z, x) # 2