当前位置: 首页 > 面试题库 >

在python中生成间隔之间的月份列表

长孙知
2023-03-14
问题内容

我想生成一个包含两个日期之间所有月份的python列表,其输入和输出的格式如下:

date1 = "2014-10-10"  # input start date
date2 = "2016-01-07"  # input end date
month_list = ['Oct-14', 'Nov-14', 'Dec-14', 'Jan-15', 'Feb-15', 'Mar-15', 'Apr-15', 'May-15', 'Jun-15', 'Jul-15', 'Aug-15', 'Sep-15', 'Oct-15', 'Nov-15', 'Dec-15', 'Jan-16']  # output

问题答案:
>>> from datetime import datetime, timedelta
>>> from collections import OrderedDict
>>> dates = ["2014-10-10", "2016-01-07"]
>>> start, end = [datetime.strptime(_, "%Y-%m-%d") for _ in dates]
>>> OrderedDict(((start + timedelta(_)).strftime(r"%b-%y"), None) for _ in xrange((end - start).days)).keys()
['Oct-14', 'Nov-14', 'Dec-14', 'Jan-15', 'Feb-15', 'Mar-15', 'Apr-15', 'May-15', 'Jun-15', 'Jul-15', 'Aug-15', 'Sep-15', 'Oct-15', 'Nov-15', 'Dec-15', 'Jan-16']

更新:
根据一个评论的要求进行一些解释。这里存在三个问题:将日期解析为适当的数据结构strptime);根据两个极端和步骤(一个月)获得日期范围;格式化输出日期(strftime)。该datetime类型会使减法运算符重载,因此end - start很有意义。结果是一个timedelta对象,代表两个日期之间的差异,并且该.days属性以天为单位表示此差异。没有.months属性,因此我们一次迭代一天,然后将日期转换为所需的输出格式。这会产生大量重复项,OrderedDict在将这些项保持正确顺序的同时将其删除。

现在,这很简单明了,因为它可以让datetime模块完成所有工作,但是效率也非常低。我们每天都需要调用很多方法,而只需要输出几个月即可。如果性能不是问题,那么上面的代码就可以了。否则,我们将需要做更多的工作。让我们将上述实现与更高效的实现进行比较:

from datetime import datetime, timedelta
from collections import OrderedDict

dates = ["2014-10-10", "2016-01-07"]

def monthlist_short(dates):
    start, end = [datetime.strptime(_, "%Y-%m-%d") for _ in dates]
    return OrderedDict(((start + timedelta(_)).strftime(r"%b-%y"), None) for _ in xrange((end - start).days)).keys()

def monthlist_fast(dates):
    start, end = [datetime.strptime(_, "%Y-%m-%d") for _ in dates]
    total_months = lambda dt: dt.month + 12 * dt.year
    mlist = []
    for tot_m in xrange(total_months(start)-1, total_months(end)):
        y, m = divmod(tot_m, 12)
        mlist.append(datetime(y, m+1, 1).strftime("%b-%y"))
    return mlist

assert monthlist_fast(dates) == monthlist_short(dates)

if __name__ == "__main__":
    from timeit import Timer
    for func in "monthlist_short", "monthlist_fast":
        print func, Timer("%s(dates)" % func, "from __main__ import dates, %s" % func).timeit(1000)

在我的笔记本电脑上,我得到以下输出:

monthlist_short 2.3209939003
monthlist_fast 0.0774540901184

简洁的实现要慢30倍左右,因此我不建议在时间紧迫的应用程序中使用它:)



 类似资料:
  • 问题内容: 我正在尝试生成时间间隔数组。例如: 它应该在祖鲁时间直到每天晚上9点创建上述元素。 也应该为下一个和后一天生成元素 起始时间从7:00 am-Ed time 9:00 pm,如果current_time> start_time,则生成15分钟的时间间隔数组,直到9 pm。然后为第二天和第二天生成2。间隔应该是这样的7:00、7:15 ..不在7:12、8:32 问题答案: 这是供您使用

  • 问题内容: 我有一个带有列的表,我需要编写一个查询/函数来生成从列的值到列的值的月份列表。 例如: 将生成以下列表: 我怎么做?我从未使用PostgreSQL生成不存在的数据…它一直在数据库中找到正确的数据…有什么想法可以做到这一点吗?它在查询中可行吗? 问题答案: 您可以使用以下函数生成数据序列: 这会以漂亮的格式为每个月生成一行。如果您希望将其像一个列表,则可以将它们全部合并到一个外部查询中:

  • 问题内容: 我想计算两个日期时间字段之间的月份数。 有没有比获得unix时间戳和除以2592 000(秒)并在MySQL中四舍五入更好的方法了? 问题答案: 该DATEDIFF功能可以给你的天数两个日期之间。由于…您如何定义一个月,哪个更准确?(28、29、30或31天?)

  • 假设我有一个这样的范围列表 现在我想找到一个范围,比如。我的算法应该给我这个范围的所有范围。例如,这个的输出应该是 <代码>输出-[1,3]、[2,5]、[4,6]、[8,10] 我该如何着手解决这个问题? PS:我知道段树可能会有所帮助。我可以在其中构建树来存储间隔并查询位于间隔内的Point,但如何在给定间隔的情况下获取所有间隔。

  • 我有一组不重叠的,不相邻的区间,例如[{10,15},{30,35},{20,25}]。它们没有排序,但如果需要,我可以对它们进行排序。 现在,我得到了一些新的区间,例如{5,32},并希望生成一组新的区间来描述差异:这个新区间所覆盖的范围不在该集合中。在这个例子中,答案是:[{5,9},{16,19},{26,29}]。 计算这个的快速算法是什么?请注意,集合中通常有1个,有时有2个,很少有3个

  • 问题内容: 我必须获取mysql中两个日期之间的月份列表。 问题答案: SQLFiddle演示