2016-10-04 3 views
1

Hallo: Fortschritte machen, aber immer noch kämpfen. Ich habe folgendes json:Python übergibt variable Daten an Funktion

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 
    } 
    } 
} 

ich eine lineare Suche bin mit dem Energiewert von einem bestimmten Tag mit dieser Funktion zu finden:

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) 

So weit so gut. Was ich als nächstes tun muss, ist den Energiewert für verschiedene Tage zu finden. Zum Beispiel heute (unter der Annahme json gültig ist):

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 

Wenn ich dieses Skript ausführen gibt es

None 

ich hier fehle muß grundlegend etwas. Was ich brauche, ist die Fähigkeit, den Energiewert für jeden Tag eines Monats eines Jahres zur weiteren Verarbeitung zu ziehen.

Danke!

Baobab

+0

drucken day_now, month_now usw. Debug von dort. – Dan

+0

Das Problem ist, dass Sie Ihre Variablen in Ints konvertieren müssen. – Dan

Antwort

2

Es ist ein einfaches Problem mit Ihrem Skript: strftime, nach der Dokumentation, wird

Rückkehr eine Zeichenfolge, die das Datum, die durch eine explizite Format-String gesteuert.

Das Schlüsselwort hier ist "String." Siehe die folgenden:

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

Diese nicht den ganzzahligen Wert des Tages in Ihre JSON-Datei nicht gleich:

>>> '04' == 4 
False 

Daher wird die Gleichheitsprüfung immer fehl und None zurückgegeben. Eine Möglichkeit besteht darin, diesen Wert mit int in eine ganze Zahl zu konvertieren. Ein besserer Weg ist es, die Attribute eines datetime Objekt zu verwenden, um die ganzzahlige Werte zu erhalten:

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

ich auch nur ein date Objekt an die Funktion raten würde geben und dort auspacken: es verhindert Redundanz und die Funktion bereinigt Unterschrift. Sie sollten auch date.today() anstelle von datetime.now() verwenden (da die Zeit irrelevant ist) und dann den Vergleich in einem Arbeitsgang durchführen. Die vollständige Funktion könnte etwa so aussehen:

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

Danke! Langsam lernen. – Baobab

+0

@Baobab Ich habe meine letzte Funktion so geändert, dass sie eine simple Logik enthält - werfen Sie einen Blick darauf! – brianpck

Verwandte Themen