如何显示给定两个日期之间的所有月份?

时间:2017-02-06 07:00:42

标签: python python-3.x

我正在尝试生成两个日期之间的月份列表。 例如:

startDate = '2016-1-31'
endDate = '2017-3-26'

结果如下:

datetime.date(2016, 1, 31)
datetime.date(2016, 2, 28)
and so on....

我正在尝试这样

startDate = '2016-1-28'
endDate = '2017-3-26'

start = date(*map(int, startDate.split('-')))
end = date(*map(int, endDate.split('-')))

week = start
dateData = []

while week <= end:
    dateData.append(week)
    week = week + datetime.timedelta(weeks=4)

pprint(dateData)

结果如下:

[datetime.date(2016, 1, 31),
 datetime.date(2016, 2, 28),
 datetime.date(2016, 3, 27),
 datetime.date(2016, 4, 24),
 datetime.date(2016, 5, 22),
 datetime.date(2016, 6, 19),
 datetime.date(2016, 7, 17),
 datetime.date(2016, 8, 14),
 datetime.date(2016, 9, 11),
 datetime.date(2016, 10, 9),
 datetime.date(2016, 11, 6),
 datetime.date(2016, 12, 4),
 datetime.date(2017, 1, 1),
 datetime.date(2017, 1, 29),
 datetime.date(2017, 2, 26),
 datetime.date(2017, 3, 26)]

这里“2016,12”&amp; “2017,1”重复两次。任何人都可以帮我解决这个问题。

3 个答案:

答案 0 :(得分:11)

您可以使用dateutil扩展程序的relativedelta方法,如下所示 -

from datetime import datetime
from dateutil.relativedelta import relativedelta

startDate = '2016-1-28'
endDate = '2017-3-26'

cur_date = start = datetime.strptime(startDate, '%Y-%m-%d').date()
end = datetime.strptime(endDate, '%Y-%m-%d').date()

while cur_date < end:
    print(cur_date)
    cur_date += relativedelta(months=1)

以下是输出

2016-01-28
2016-02-28
2016-03-28
2016-04-28
2016-05-28
2016-06-28
2016-07-28
2016-08-28
2016-09-28
2016-10-28
2016-11-28
2016-12-28
2017-01-28
2017-02-28

答案 1 :(得分:1)

我还没有足够的特权发表评论,但你的计划完全按照它所说的去做。 4周等于28天。 1月1日至1月29日(2017年)之间的差异为28天;因此,你将在同一个月两次。

您可能想要重新定义您要解决的问题。但是,如果你想要解决两个日期之间的几年中的几个月,你的代码将需要一些扩展。

  1. 您需要创建一个循环来迭代多年和几个月。
  2. 您需要一个开始年份和结束年份的条件,以确保您从开始月份开始并在结束月份结束。
  3. 这是一个工作示例,它还包括列表中的开始和结束日期。我希望它有所帮助:

    import datetime
    
    startDate = '2016-1-28'
    endDate = '2017-3-26'
    
    start = datetime.date(*map(int, startDate.split('-')))
    end = datetime.date(*map(int, endDate.split('-')))
    
    week = start
    dateData = []
    
    dateData.append(start)
    
    rangeYear = (end.year - start.year)
    
    for i in range(rangeYear + 1):
        if i == 0:
            for j in range(1,13-start.month):
                date = datetime.date(start.year, start.month+j, 1)
                dateData.append(date)
        elif (i > 0) & (i < rangeYear):
            for j in range(1,12):
                date = datetime.date(start.year+i, j, 1)
                dateData.append(date)
        elif i == rangeYear:
            for j in range(1,end.month):
                date = datetime.date(start.year+i, j, 1)
                dateData.append(date)
    
    dateData.append(end)
    

答案 2 :(得分:1)

您也只能在一行中使用熊猫:

import pandas as pd
pd.date_range('2018-01', '2020-05', freq='M')

输出将是:

DatetimeIndex(['2018-01-31', '2018-02-28', '2018-03-31', '2018-04-30',
           '2018-05-31', '2018-06-30', '2018-07-31', '2018-08-31',
           '2018-09-30', '2018-10-31', '2018-11-30', '2018-12-31',
           '2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',
           '2019-05-31', '2019-06-30', '2019-07-31', '2019-08-31',
           '2019-09-30', '2019-10-31', '2019-11-30', '2019-12-31',
           '2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30'],
          dtype='datetime64[ns]', freq='M')