2016-08-30 1 views
1

J'essaie d'extraire des données financières d'une API qui renvoie un objet JSON. L'API n'indique pas explicitement que les dictionnaires retournés sont des OrderedDicts mais la sortie est toujours triée, donc je vais faire l'hypothèse que c'est le cas.Récupérer la valeur de la dernière clé du dictionnaire

Je dois récupérer la valeur de la dernière clé du dictionnaire car j'ai besoin des chiffres financiers les plus récents. Cependant, je ne peux pas utiliser explicitement le nom de la clé pour l'extraire comme il est dans un format de date et peut être différent en fonction de l'entreprise utilisant interrogé.

J'ai essayé de convertir l'objet du dictionnaire dans une liste et sélectionnez la dernière clé en utilisant un index de -1, mais le processus de conversion semble randomiser l'ordre du dictionnaire ne récupère plus la dernière date.

Alors, comment puis-je récupérer la valeur de la dernière clé dans le dictionnaire?

Voici un exemple de ce que l'objet JSON ressemble:

{'2007-06-01T00:00:00': 21.19, 
'2008-06-01T00:00:00': 26.01, 
    '2009-06-01T00:00:00': 19.34, 
    '2010-06-01T00:00:00': 22.88, 
    '2011-06-01T00:00:00': 23.77, 
    '2012-06-01T00:00:00': 14.77, 
    '2013-06-01T00:00:00': 16.58, 
    '2014-06-01T00:00:00': 14.02, 
    '2015-06-01T00:00:00': 7.0, 
    '2016-06-01T00:00:00': 9.08} 
+4

Habituellement, si l'API ne spécifie pas qu'elle fait quelque chose qu'elle fait réellement, vous ne devriez pas compter sur elle pour continuer à le faire. –

+2

Si les clés sont toutes comparables alors la plus haute serait la plus récente donc vous faites 'max (data.keys())' pour obtenir la clé la plus récente, en fonction du format que vous pourriez avoir besoin de spécifier une clé = .. .' mettre les dates dans un format qui sera comparé correctement. –

+0

Vous pouvez convertir les chaînes de date en objets 'datetime' réels, les trier et obtenir le plus grand. –

Répondre

4

Après avoir examiné le problème que je me rends compte que parce que la date est dans un format qu'ils sont correctement comparables sous forme de chaînes, vous pouvez juste faire k,v = max(data.items()) Cependant si vous (ou quelqu'un d'autre regardant ce fil) utilise un format de date qui ne fonctionne pas comme ça, ma réponse originale est ci-dessous.


vous pouvez simplement utiliser la max builtin pour comparer les clés du dictionnaire, pour vous assurer qu'ils sont tous comparés les dates et les heures que vous pouvez utiliser l'argument key pour les comparer comme des objets datetime:

import datetime 

data = {'2007-06-01T00:00:00': 21.19, 
'2008-06-01T00:00:00': 26.01, 
    '2009-06-01T00:00:00': 19.34, 
    '2010-06-01T00:00:00': 22.88, 
    '2011-06-01T00:00:00': 23.77, 
    '2012-06-01T00:00:00': 14.77, 
    '2013-06-01T00:00:00': 16.58, 
    '2014-06-01T00:00:00': 14.02, 
    '2015-06-01T00:00:00': 7.0, 
    '2016-06-01T00:00:00': 9.08} 

def converter(timestamp): 
    return datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S") 

highest = max(data.keys(),key=converter) 

print(highest) #2016-06-01T00:00:00 
+0

En fait 'max (data.items(), key = ...)' ressemble plus à OP car il veut récupérer la valeur associée à la clé. Assurez-vous que 'converter' prend un tuple au lieu d'un horodatage. – ozgur

+0

L'écriture de la fonction du convertisseur semblait plus simple que de traiter la clé, alors il suffit d'obtenir 'value = data [highest]', mais absolument vous pourriez le faire aussi. –

+0

Cela a du sens. BTW, vous n'avez pas besoin de '.keys()'. – ozgur