作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试查找最接近给定日期的季度末:例如2014 年 5 月 27 日的最近季度末为 2014 年 6 月 30 日,2013 年 2 月 2 日的最近季度末为 2012 年 12 月 31 日。我有以下内容,但它没有给我 2015 年 8 月 15 日这样的日期的预期输出:
import datetime
tester = datetime.datetime(2015, 8, 15)
calendar_date = datetime.datetime(tester.year - 1, 12, 31)
for dd in [(3, 31), (6, 30), (9, 30), (12, 31)]:
diff = abs(datetime.datetime(tester.year, dd[0], dd[1]) - tester)
if diff.days <= 45:
calendar_date = datetime.datetime(tester.year, dd[0], dd[1])
break
print tester, calendar_date
我通过假设每个季度为 90 天进行了简化,因此在 45 天时取其中的 1/2(有更好的方法吗???),但显然这不适用于 2015 年 8 月 16 日,因为它打印:
2015-08-15 00:00:00 2014-12-31 00:00:00
我预计2015-09-30 00:00:00
最佳答案
datetime.timedelta
可能为负且 diff.days <= 45
对于负时间增量始终为真,因此结果不正确。
您已经有了一个简单的解决方案,并且候选人已经就位。这些是
datetime.timedelta
对象具有相对比较运算符,即它们形成全序,这意味着存在最小值。正如 Padraic Cunningham 的评论中所指出的,您希望候选人与目标日期的最小绝对距离:
def get_closest_quarter(target):
# candidate list, nicely enough none of these
# are in February, so the month lengths are fixed
candidates = [
datetime.date(target.year - 1, 12, 31),
datetime.date(target.year, 3, 31),
datetime.date(target.year, 6, 30),
datetime.date(target.year, 9, 30),
datetime.date(target.year, 12, 31),
]
# take the minimum according to the absolute distance to
# the target date.
return min(candidates, key=lambda d: abs(target - d))
这里的代码使用datetime.date
为了简单起见,但应该很容易推广到 datetime.datetime
如果需要的话。
关于python - 找到最近的季度末约会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32444638/
我是一名优秀的程序员,十分优秀!