在python中我有一件很简单的事情要做: 我需要一个从今天开始(包括)的过去x个月的元组列表。因此,对于x=10和今天(2011年7月),命令应该输出:
[(2011, 7), (2011, 6), (2011, 5), (2011, 4), (2011, 3),
(2011, 2), (2011, 1), (2010, 12), (2010, 11), (2010, 10)]
只应使用python的默认datetime实现。我想出了以下解决方案:
import datetime
[(d.year, d.month) for d in [datetime.date.today()-datetime.timedelta(weeks=4*i) for i in range(0,10)]]
这个解决方案为我的测试用例输出了正确的解决方案,但是我对这个解决方案并不满意:它假设一个月有四个星期,而这根本不是真的。我可以用days=30
替换weeks=4
,这样可以得到更好的解决方案,但仍然不正确。
我想到的另一个解决办法是用简单的数学,从月计数器中减去1,如果月计数器是0,则从年计数器中减去1。这个解决方案的问题是:它需要更多的代码,而且可读性也不强。
那么,如何才能正确地做到这一点呢?
最简单的方法是使用integer division(
//
)和modulus(%
)函数,用0年以来的月数表示月份:当我们稍后将1添加到模函数的结果中以获得1索引时,需要
- 1
表达式中的months
才能得到正确的答案(即月从1到12而不是0到11)。或者您可能要创建生成器:
可用于:
使用
relativedelta
。。。我在任何地方都看不到它的文档,但是
time.mktime
如果超出范围(包括负的月份值),将“滚动”到正确的年份:相关问题 更多 >
编程相关推荐