如何从基本的多个词典到字典列表计算startdate和enddate

时间:2013-10-30 03:12:20

标签: python

如何从多个字典到字典列表,需要从基本计算startdate和enddate

[{'basic': 1000.0, 'end_date': '2011-01-31', 'start_date': '2011-01-01'}, 
 {'basic': 1000.0, 'end_date': '2011-05-31', 'start_date': '2011-05-01'}, 
 {'basic': 2000.0, 'end_date': '2012-01-31', 'start_date': '2012-01-01'}, 
 {'basic': 2000.0, 'end_date': '2012-05-31', 'start_date': '2012-05-01'},
 {'basic': 2500.0, 'end_date': '2012-07-31', 'start_date': '2012-07-01'},
 {'basic': 2500.0, 'end_date': '2012-08-31', 'start_date': '2012-08-01'},
 {'basic': 3500.0, 'end_date': '2013-01-31', 'start_date': '2013-01-01'}, 
 {'basic': 3500.0, 'end_date': '2013-02-28', 'start_date': '2013-02-01'},
 {'basic': 4000.0, 'end_date': '2013-11-30', 'start_date': '2013-11-01'}]

如果基本金额相等,我需要合并等金额字典,start_date是开始日期,end_date是年终日期

说一个例子

{'basic': 1000.0, 'end_date': '2011-01-31', 'start_date': '2011-01-01'}, 
{'basic': 1000.0, 'end_date': '2011-05-31', 'start_date': '2011-05-01'}, 

两个字典相等所以我需要得到这样的

[{'basic': 1000.0, 'start_date': '2011-01-01', 'end_date': '2011-12-31',},
 {'basic': 2000.0, 'start_date': '2012-01-01', 'end_date': '2012-06-31', },
 {'basic': 2500.0, 'start_date': '2012-07-01', 'end_date': '2012-12-31',}, 
 {'basic': 3500.0, 'start_date': '2013-01-01', 'end_date': '2013-10-31'}, 
 {'basic': 4000.0, 'start_date': '2013-11-01', 'end_date': '2013-12-30'}]

2 个答案:

答案 0 :(得分:1)

import datetime
def convertDate(dateString):
    return datetime.datetime.strptime(dateString, "%Y-%m-%d").date()

dates = [{'basic': 1000.0, 'end_date': '2011-01-31', 'start_date': '2011-01-01'}, 
 {'basic': 1000.0, 'end_date': '2011-05-31', 'start_date': '2011-05-01'}, 
 {'basic': 2000.0, 'end_date': '2012-01-31', 'start_date': '2012-01-01'}, 
 {'basic': 2000.0, 'end_date': '2012-05-31', 'start_date': '2012-05-01'},
 {'basic': 2500.0, 'end_date': '2012-07-31', 'start_date': '2012-07-01'},
 {'basic': 2500.0, 'end_date': '2012-08-31', 'start_date': '2012-08-01'},
 {'basic': 3500.0, 'end_date': '2013-01-31', 'start_date': '2013-01-01'}, 
 {'basic': 3500.0, 'end_date': '2013-02-28', 'start_date': '2013-02-01'},
 {'basic': 4000.0, 'end_date': '2013-11-30', 'start_date': '2013-11-01'}]

tempResult = {}
for dateDict in dates:
    if dateDict["basic"] in tempResult:
        if convertDate(tempResult[dateDict["basic"]]["end_date"]) < convertDate(dateDict["end_date"]):
            tempResult[dateDict["basic"]]["end_date"] = dateDict["end_date"]
        if convertDate(tempResult[dateDict["basic"]]["start_date"]) > convertDate(dateDict["start_date"]):
            tempResult[dateDict["basic"]]["start_date"] = dateDict["start_date"]
    else:
        tempResult[dateDict["basic"]] = dateDict
print [value for _, value in tempResult.items()]

<强>输出

[{'start_date': '2011-01-01', 'end_date': '2011-05-31', 'basic': 1000.0},
 {'start_date': '2012-01-01', 'end_date': '2012-05-31', 'basic': 2000.0},
 {'start_date': '2013-01-01', 'end_date': '2013-02-28', 'basic': 3500.0},
 {'start_date': '2012-07-01', 'end_date': '2012-08-31', 'basic': 2500.0},
 {'start_date': '2013-11-01', 'end_date': '2013-11-30', 'basic': 4000.0}]

答案 1 :(得分:0)

您的数据结构对此操作很奇怪;这是一种不同的方法:

d = {}

for i in dates:
  if not i['basic'] in d:
     d[i['basic']] = {}
     d[i['basic']]['start_date'] = []
     d[i['basic']]['end_date'] = []
  d[i['basic']]['start_date'].append(int(i['start_date'].replace('-','')))
  d[i['basic']]['end_date'].append(int(i['end_date'].replace('-','')))

# This will give you:

>>> d
{1000.0: {'start_date': [20110101, 20110501], 'end_date': [20110131, 20110531]},
 2000.0: {'start_date': [20120101, 20120501], 'end_date': [20120131, 20120531]},
 3500.0: {'start_date': [20130101, 20130201], 'end_date': [20130131, 20130228]},
 2500.0: {'start_date': [20120701, 20120801], 'end_date': [20120731, 20120831]},
 4000.0: {'start_date': [20131101], 'end_date': [20131130]}}

# Next, sort the start and end dates. We want the earliest start date,
# and the last end date for each number

for i in d.values():
   i['start_date'].sort()
   i['end_date'].sort(reverse=True)

# Now we have:

>>> d
{1000.0: {'start_date': [20110101, 20110501], 'end_date': [20110531, 20110131]},
 2000.0: {'start_date': [20120101, 20120501], 'end_date': [20120531, 20120131]},
 3500.0: {'start_date': [20130101, 20130201], 'end_date': [20130228, 20130131]},
 2500.0: {'start_date': [20120701, 20120801], 'end_date': [20120831, 20120731]},
 4000.0: {'start_date': [20131101], 'end_date': [20131130]}}

# To build our final result; we need to have for each
# number, the earliest start date, and the latest end date (which are the first
# items of each `start_date` and `end_date` dictionary keys

# Then we just do some formatting to get it back in to the date string

result = []
for i,v in d.iteritems():
   j = {}
   j['basic'] = i

   # Convert the start and end dates into strings
   # and format them
   start = str(v['start_date'][0])
   end = str(v['end_date'][0])

   j['start_date'] = '{0}-{1}-{2}'.format(start[:4],start[4:6],start[-2:])
   j['end_date'] = '{0}-{1}-{2}'.format(end[:4],end[4:6],end[-2:])

   result.append(j)
相关问题