如何从日期范围之间的每个月中提取年份和月份?

时间:2018-06-22 20:37:22

标签: python python-2.7

说我的开始日期和结束日期分别为2017-11-23和2018-03-13。

我的输出将是2D列表的列表:

[[2017,11],
[2017,12],
[2018,1],
[2018,2],
[2018,3]]

最有效的方法是什么?

3 个答案:

答案 0 :(得分:1)

您可能会使用datetime.date,特别是如果您已经将其用于程序日期处理的其他方面。

import datetime

def generate_months(start, end):
    start = start.replace(day=1)
    end = end.replace(day=1)
    while start <= end:
        yield [start.year, start.month]
        try:
            start = start.replace(month=start.month+1)
        except ValueError:
            start = start.replace(year=start.year+1, month=1)


start = datetime.date(2017, 11, 23)
end = datetime.date(2018, 3, 13)

result = list(generate_months(datetime.date(2017, 11, 23),
                              datetime.date(2018, 3, 13)))
print(result)

答案 1 :(得分:0)

您可以使用__sub__方法创建一个简单的类:

s = ['2017-11-23', '2018-03-13']
import functools
class Date: 
  def __init__(self, _d):
    self.__dict__ = dict(zip(['year', 'month', 'day'], map(int, _d.split('-'))))
  def __sub__(self, new_date):
     _y, _m = self.year, self.month
     _result = [[_y, _m]]
     while _y < new_date.year or _m < new_date.month:
       _m += 1
       if _m > 12:
         _y += 1
         _m = 1
       _result.append([_y, _m])
     return _result

final_result = functools.reduce(lambda x, y:x-y, map(Date, s))

输出:

[[2017, 11], [2017, 12], [2018, 1], [2018, 2], [2018, 3]]

但是请注意,您也可以使用datetime模块:

import datetime
d = datetime.date(*map(int, s[0].split('-')))
d1 = datetime.date(*map(int, s[-1].split('-')))
result = {(d + datetime.timedelta(i)).strftime('%Y-%m') for i in range((d1-d).days+1)}
final_result = sorted(map(lambda x:list(map(int, x.split('-'))), result))

输出:

[[2017, 11], [2017, 12], [2018, 1], [2018, 2], [2018, 3]]

答案 2 :(得分:0)

通过执行dateutil安装pip install python-dateutil 之后,您可以使用dateutil.rrule在两个时间戳之间迭代日期/时间

>>> from dateutil import rrule, parser
>>> d1=parser.parse('2017-11-23')
>>> d2=parser.parse('2018-03-13')
>>> 
>>> f = lambda d: [d.year, d.month]
>>> [f(d) for d in rrule.rrule(rrule.MONTHLY, dtstart=d1, until=d2)] + [f(d2)]
[[2017, 11], [2017, 12], [2018, 1], [2018, 2], [2018, 3]]
>>>