从字典到列表的日期

时间:2019-05-02 13:49:27

标签: python

这对我来说太复杂了,因此我正在寻求帮助。我有这样的字典:

dict = {'date_from': u'2019-04-01', 
        'date_to': u'2019-04-30'}

从这个字典中,我需要列出这样的列表:

list = ['2019-04']

因为月份相同。

如果dict是这样的

dict = {'date_from': u'2019-04-01', 
        'date_to': u'2019-05-30'}

列表应为:

list = ['2019-04', '2019-05']

以此类推。

另一个示例

dict = {'date_from': u'2019-01-01', 
         'date_to': u'2019-05-30'}


list = ['2019-01', '2019-02','2019-03','2019-04','2019-05']

我知道这是有可能的,但无法弄清楚如何使其发挥作用。

2 个答案:

答案 0 :(得分:2)

使用datetimerelativedelta

例如:

import datetime
from dateutil.relativedelta import relativedelta

d = {'date_from': u'2019-01-01', 'date_to': u'2019-05-30'}
result = []
start = datetime.datetime.strptime(d["date_from"], "%Y-%m-%d") 
end = datetime.datetime.strptime(d["date_to"], "%Y-%m-%d")
while True:
    if start > end:
        break
    result.append(start.strftime("%Y-%m"))
    start = start + relativedelta(months=1)
print(result)   

输出:

['2019-01', '2019-02', '2019-03', '2019-04', '2019-05']

答案 1 :(得分:1)

您可以使用列表理解:

import datetime

d1= datetime.datetime(2019, 1, 1, 0, 0)
d2= datetime.datetime(2020, 5, 30, 0, 0)

rslt= [ f"{year}-{month:02}" for year in range(d1.year,d2.year+1) for month in range(1,13) if (d1.year,d1.month)<=(year,month)<=(d2.year,d2.month)]

print(rslt)

Out: ['2019-01', '2019-02', '2019-03', '2019-04', '2019-05', '2019-06', '2019-07', '2019-08', '2019-09', '2019-10', '2019-11', '2019-12', '2020-01', '2020-02', '2020-03', '2020-04', '2020-05']

编辑: 我们不需要datetime对象。

dd = {'date_from': '2019-04-01', 
        'date_to': '2020-05-30'}

d1year, d1month, d1day= [ int(e) for e in dd['date_from'].split("-") ]
d2year, d2month, d2day= [ int(e) for e in dd['date_to'].split("-") ]

rslt= [ f"{year}-{month:02}" for year in range(d1year,d2year+1) for month in range(1,13) if (d1year,d1month)<=(year,month)<=(d2year,d2month)]

print(rslt)