说我的开始日期和结束日期分别为2017-11-23和2018-03-13。
我的输出将是2D列表的列表:
[[2017,11],
[2017,12],
[2018,1],
[2018,2],
[2018,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]]
>>>