我想从现在到2010年8月之间获得所有月份,因为列表格式如下:
['2010-08-01', '2010-09-01', .... , '2016-02-01']
Run Code Online (Sandbox Code Playgroud)
现在这就是我所拥有的:
months = []
for y in range(2010, 2016):
for m in range(1, 13):
if (y == 2010) and m < 8:
continue
if (y == 2016) and m > 2:
continue
month = '%s-%s-01' % (y, ('0%s' % (m)) if m < 10 else m)
months.append(month)
Run Code Online (Sandbox Code Playgroud)
什么是更好的方法来做到这一点?
Ani*_*Ani 20
dateutil.relativedelta
在这里很方便.
我把格式化作为练习.
from dateutil.relativedelta import relativedelta
import datetime
result = []
today = datetime.date.today()
current = datetime.date(2010, 8, 1)
while current <= today:
result.append(current)
current += relativedelta(months=1)
Run Code Online (Sandbox Code Playgroud)
使用datetime
和timedelta
标准Python的模块 - 无需安装任何新库
from datetime import datetime, timedelta
now = datetime(datetime.now().year, datetime.now().month, 1)
ctr = datetime(2010, 8, 1)
list = [ctr.strftime('%Y-%m-%d')]
while ctr <= now:
ctr += timedelta(days=32)
list.append( datetime(ctr.year, ctr.month, 1).strftime('%Y-%m-%d') )
Run Code Online (Sandbox Code Playgroud)
我32
每天都要加入新的月份(最长的月份有31
几天)
我看了一下dateutil
文档.事实证明它提供了比使用更方便的方法dateutil.relativedelta
:重复规则(示例)
对于手头的任务,它就像
from dateutil.rrule import *
from datetime import date
months = map(
date.isoformat,
rrule(MONTHLY, dtstart=date(2010, 8, 1), until=date.today())
)
Run Code Online (Sandbox Code Playgroud)
请注意,我们在这里作弊.元素dateutil.rrule.rrule
产生的类型的datetime.datetime
,即使我们通过dtstart
和until
类型的datetime.date
,如我们上面做.我让map
他们喂date
的isoformat
功能,偏偏将它们转换为字符串,如果它只是日期没有时间的日的任何信息.
因此,看似相等的列表理解
[day.isoformat()
for day in rrule(MONTHLY, dtstart=date(2010, 8, 1), until=date.today())]
Run Code Online (Sandbox Code Playgroud)
会返回一个列表
['2010-08-01T00:00:00',
'2010-09-01T00:00:00',
'2010-10-01T00:00:00',
'2010-11-01T00:00:00',
?
'2015-12-01T00:00:00',
'2016-01-01T00:00:00',
'2016-02-01T00:00:00']
Run Code Online (Sandbox Code Playgroud)
因此,如果我们想要使用列表理解而不是map
,我们必须做类似的事情
[dt.date().isoformat()
for dt in rrule(MONTHLY, dtstart=date(2010, 8, 1), until=date.today())]
Run Code Online (Sandbox Code Playgroud)