2016-10-04 6 views
1

こんにちは:進歩していますが、依然として苦労しています。私はこの機能で特定の日からのエネルギー値を見つけるために、線形検索を使用していますPythonは可変日付を関数に渡します

json = 
{ 
    "emeter": { 
    "get_daystat": { 
     "day_list": [ 
     { "year": 2016, "month": 10, "day": 1, "energy": 0.651000 }, 
     { "year": 2016, "month": 10, "day": 2, "energy": 0.349000 }, 
     { "year": 2016, "month": 10, "day": 3, "energy": 0.481000 } 
     ], 
     "err_code": 0 
    } 
    } 
} 

parsed_json = json.loads(json) 

def get_energy_value_by_date(obj, year, month, day): 
    for value in obj['emeter']['get_daystat']['day_list']: 
     if value['year'] == year and value['month'] == month and value['day'] == day: 
      return value['energy'] 


energy = get_energy_value_by_date(parsed_json, 2016, 10, 2) 

これまでのところは良い、私は次のようなJSONを持っています。私が次に必要とするのは、さまざまな日のエネルギー価値を見つけることです。例えば、今日は(JSONが有効であると仮定):私はこのスクリプトを実行すると

import datetime 
day_now = datetime.datetime.now().strftime("%d") 
month_now = datetime.datetime.now().strftime("%m") 
year_now = datetime.datetime.now().strftime("%Y") 

parsed_json = json.loads(json) 

def get_energy_value_by_date(obj, year, month, day): 
    for value in obj['emeter']['get_daystat']['day_list']: 
     if value['year'] == year and value['month'] == month and value['day'] == day: 
      return value['energy'] 


energy_today = get_energy_value_by_date(parsed_json, year_now, month_now, day_now) 
print energy_today 

それは私がここに基本的な何かが欠けする必要があります

None 

を返します。私が必要とするのは、さらなる処理のために任意の年の任意の日のエネルギー価値を引き出す能力です。

ありがとうございます!

バオバブ

+0

印刷日_now、月_nowなどそこからのデバッグ。 – Dan

+0

変数をintにキャストする必要があるという問題があります。 – Dan

答えて

2

スクリプトで簡単な問題があります:ドキュメントによるとstrftimeは、意志

リターン明示的な書式化文字列で制御された、日付を表現する文字列。

ここでキーワードは「文字列」です。以下を参照してください。

>>> import datetime 
>>> day_now = datetime.datetime.now().strftime("%d") 
>>> day_now 
'04' 

これはあなたのJSONファイルで一日の整数値に等しくない:

>>> '04' == 4 
False 

したがって、平等のチェックは常に失敗し、Noneが返されます。 1つの方法は、intを使用して、この値を整数に変換することです。より良い方法は、整数値を取得するためにdatetimeオブジェクトの属性を使用することです:

>>> datetime.datetime.now().year 
2016 
>>> datetime.datetime.now().month 
10 
>>> datetime.datetime.now().day 
4 

私はまた、関数にだけdateオブジェクトを渡すと、そこに開梱助言:それは冗長性を防ぎ、機能をクリーンアップ署名。また、datetime.now()の代わりにdate.today()を使用してください(時間は無関係です)ので、1回の操作で比較を行う必要があります。全機能は次のようなものになります。

def get_energy_value_by_date(obj, current_day): 
    for value in obj['emeter']['get_daystat']['day_list']: 
     if current_day == datetime.date(value['year'], value['month'], value['day']): 
      return value['energy'] 

current_day = datetime.date.today() 
energy_today = get_energy_value_by_date(parsed_json, current_day) 
print (energy_today) 
+1

ありがとうございました!ゆっくりと学ぶ。 – Baobab

+0

@Baobab私は最後の機能を編集して、いくつかの単純なロジックを組み込みました。 – brianpck

関連する問題