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

新手上路,请多包涵

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

 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”和“2017, 1”重复了两次。谁能帮我解决这个问题。

原文由 nas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 428
2 个回答

您可以使用 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

原文由 shad0w_wa1k3r 发布,翻译遵循 CC BY-SA 4.0 许可协议

你也可以在一行中只使用 pandas:

 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')

原文由 asmatrk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题