我正在尝试生成两个日期之间的月份列表。 例如:
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”重复两次。任何人都可以帮我解决这个问题。
答案 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天;因此,你将在同一个月两次。
您可能想要重新定义您要解决的问题。但是,如果你想要解决两个日期之间的几年中的几个月,你的代码将需要一些扩展。
这是一个工作示例,它还包括列表中的开始和结束日期。我希望它有所帮助:
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')