繁体   English   中英

忽略年份的两个日期之间的差异

[英]Difference between two dates ignoring year

Python 日期时间对象需要一年,但是我只想写一个 function 输出忽略年份的两个日月之间的日期差异。 这意味着 function 的 output 范围是 [-182, 183],因为计算应该“环绕”一年。

示例:目标日期:1 月 1 日猜测:12 月 31 日结果:-1

目标日期:1 月 1 日猜测:1 月 2 日结果:+1

def date_diff(goal, guess):
    #goal and guess are in the format "%m-%d"
    
    goal_date = datetime.strptime(goal + "-2020", "%m-%d-%Y")
    goal_date1 = datetime.strptime(goal + "-2021", "%m-%d-%Y")
    guess_date = datetime.strptime(guess + "-2020", "%m-%d-%Y")
    guess_date1 = datetime.strptime(guess + "-2021", "%m-%d-%Y")
    
    r1 = goal_date - guess_date
    r1 = r1.days
    r3 = goal_date1 - guess_date
    r3 = r3.days
    r2 = guess_date1 - goal_date
    r2 = r2.days
    r4 = guess_date - goal_date
    r4 = r4.days

    r = ((r1, math.copysign(1, r1)), (r2, math.copysign(1, r2)),(r3, math.copysign(1, r2)),(r4, math.copysign(1, r4)))
    
    #idea here was the find min of index 0 of each tuple then restore the sign, but i think i'm missing some combinations
    smallest =  min(r, key = lambda x:abs(x[0]))
    return smallest[0]*smallest[1]

您可以在第一个日期的上一年、同一年和下一年取与第二个日期的最小(绝对)差异

例如:

from datetime import date
def dateDelta(d1,d2):
    return min(((date(d1.year+i,d2.month,d2.day)-d1).days 
                 for i in (-1,0,1)),key=abs)


d1 = date(2002,10,15)
d2 = date(2002,2,3)

print(dateDelta(d1,d2)) # 111
print(dateDelta(d2,d1)) # -111

请注意,根据您选择的参考年份,您可能会得到不同的结果。 为避免闰年的干扰,select 为 d1 的非闰年,既不在闰年之前也不在闰年之后(例如 2002 年,或任何年份 mod 4 == 2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM