2017-05-01 9 views
3

私は次のようになり、データエントリの束を持っている:PythonのJSON/Dictの検索や値の更新

{'formType': 'tax', 'periodEndDate': '2016-03-31', 'periodStartDate': 'NULL', 'fiscalYearEnd': 2016, 'label': 'FY2016'} 
{'formType': 'tax', 'periodEndDate': '2015-03-31', 'periodStartDate': 'NULL', 'fiscalYearEnd': 2015, 'label': 'FY2015'} 
{'formType': 'tax', 'periodEndDate': '2014-03-31', 'periodStartDate': 'NULL', 'fiscalYearEnd': 2014, 'label': 'FY2014'} 
{'formType': 'amend', 'periodEndDate': '2015-06-30', 'periodStartDate': 'NULL', 'fiscalYearEnd': 'NULL', 'label': 'NULL'} 
{'formType': 'amend', 'periodEndDate': '2015-09-30', 'periodStartDate': 'NULL', 'fiscalYearEnd': 'NULL', 'label': 'NULL'} 
{'formType': 'amend', 'periodEndDate': '2014-06-30', 'periodStartDate': 'NULL', 'fiscalYearEnd': 'NULL', 'label': 'NULL'} 
{'formType': 'amend', 'periodEndDate': '2014-09-30', 'periodStartDate': 'NULL', 'fiscalYearEnd': 'NULL', 'label': 'NULL'} 

私は、このデータを検索し、1日後の日付に「periodStartDate」の値を設定したいです以前のperiodEndDate(同じformTypeの)エントリ。私はdatetimeと日付の追加などを使用して快適ですが、私はどのようにperiodStartDateを推定するために、このファイル内のさまざまなラインアイテムを相互参照するのか分かりません。

また、 'formType': 'amend'は、上記 'formType': 'tax'のキーと値のペアの間にくさびっている年を使って、 'fiscalYearEnd'値を設定する必要があります。

+1

それはdictsのリストですか?また、期待される結果を表示してください – RomanPerekhrest

+0

はい、そのdictsのリストです。 key:valueでドキュメント全体を検索し、任意のキーを使用して値を返すことができるようにします。 たとえば、「fiscalYearEnd = 2015の行を検索し、その行のperiodEndDate(または何でも)を返します。私は、dictsのリストが混乱している場合、他のデータ構造にもオープンしています。私はこの形式を選んだのは、最終的にエクスポートして保存する予定のjsonと似ているからです。 – JackBurton

答えて

3

私はあなたが私が私の例をシミュレートするために、あなたがリストに提供dictsを変換datetime.timedelta

を使用して欲しい結果を得るために、そのリストを反復処理し、その後list of dictsに各行をインポートします。

import datetime 

list_of_dicts =[ 
       {'formType': 'tax', 'periodEndDate': '2016-03-31', 'periodStartDate': 'NULL', 'fiscalYearEnd': 2016, 'label': 'FY2016'}, 
       {'formType': 'tax', 'periodEndDate': '2015-03-31', 'periodStartDate': 'NULL', 'fiscalYearEnd': 2015, 'label': 'FY2015'}, 
       {'formType': 'tax', 'periodEndDate': '2014-03-31', 'periodStartDate': 'NULL', 'fiscalYearEnd': 2014, 'label': 'FY2014'}, 
       {'formType': 'amend', 'periodEndDate': '2015-06-30', 'periodStartDate': 'NULL', 'fiscalYearEnd': 'NULL', 'label': 'NULL'}, 
       {'formType': 'amend', 'periodEndDate': '2015-09-30', 'periodStartDate': 'NULL', 'fiscalYearEnd': 'NULL', 'label': 'NULL'}, 
       {'formType': 'amend', 'periodEndDate': '2014-06-30', 'periodStartDate': 'NULL', 'fiscalYearEnd': 'NULL', 'label': 'NULL'}, 
       {'formType': 'amend', 'periodEndDate': '2014-09-30', 'periodStartDate': 'NULL', 'fiscalYearEnd': 'NULL', 'label': 'NULL'} 
       ] 

def searchForYear(year): 
    for subdict in list_of_dicts: 
     if str(year) == 'NULL': 
      print ("Year is NULL") 
     elif str(year) == str(subdict['fiscalYearEnd']): 
      if input('Do you want update this row? ') == 'yes': 
       EndDate = datetime.datetime.strptime((subdict['periodEndDate']),"%Y-%m-%d").date() 
       StartDate = EndDate + datetime.timedelta(days=1) 
       subdict['periodStartDate'] = StartDate 
       print ("StartDate is now ",subdict['periodStartDate']) 
      else: 
       print ("Did not update") 

     else: 
      print ("Year does not appear in this row") 


submitYear = input("Check and update Year: ") 
searchForYear(submitYear) 

結果のようなものでなければなりません:

Check and update Year: 2016 
Do you want update this row? yes 
StartDate is now 2016-04-01 
Year does not appear in this row 
Year does not appear in this row 
Year does not appear in this row 
Year does not appear in this row 
Year does not appear in this row 
Year does not appear in this row 
+0

@JackBurton:すべての編集を申し訳ありません。私はあなたが必要と思ったようにすべてのものを働かせるためにそれをぐちゃぐちゃにしていました。これが助けられたら教えてください。 –

+0

@JackBurton:問題が解決したら、答えの横にあるチェックマークを必ず選択してください。これは、彼らが自分の問題の1つに関連してこの投稿を見つけた場合、他の人が必要とする答えを見つけるのを助けるでしょう:) –

+0

ありがとうございます - このコードは、同じdictのEndDateに基づいてStartDateを設定するようです。たとえば、 'fiscalYearEnd'でディクテーションのリスト全体を検索し、fiscalYearEnd検索値と一致するrow/dictのEndDate値を返し、そのEndDateを使用して自分の行のStartDateを設定したいと考えています。 – JackBurton