查找字典的最大日期小于或等于变量,返回值
我安装了python packagefred
,使用pip install fred
,从FRED/ALFRED API获取实时数据。查找字典的最大日期小于或等于变量,返回值
我现在的任务是将评估日期匹配到的数据 - 因此,提取具有最大realtime_date
这是小于或等于什么我打电话的评估基准日(aDate
)关联的值。
数据本身在包含列表的Python字典中返回,每个观察值都与一些元数据一起存储在字典中 - 每个观察字典包含:参考日期(date
),实时期请求覆盖(realtime_end
,realtime_start
)和值(value
)。
我可以看到如何将数据与确切匹配时的评估日期进行匹配,但在现实世界中,这些都是例外情况。我正在寻求帮助,将其归纳为不平等。
(注意下面我使用变量fredKey
- 而您必须提供自己的FRED API密钥才能访问FRED)。
import fred
fred.key(fredKey)
CPIobvs = fred.observations('CPIAUCSL', realtime_start = "1990-01-01")
aDate == "2008-02-15"
for i in range(1, len(CPIobvs['observations']['observation'])):
if CPIobvs['observations']['observation'][i]['realtime_start'] == aDate:
print (CPIobvs['observations']['observation'][i]['date'],
CPIobvs['observations']['observation'][i]['value']
)
在这个例子中,我选择了一个年度基准修订日期,以确保获得回报。在实践中,我通常会在发生注意事件的日期更新模拟 - 在这种情况下,我的方法不会返回任何内容。
该解决方案似乎与小于或等于评估日期(例如aDate == "2008-02-14"
)的最大日期(realtime_start
值)相匹配。我怎么可能匹配最大的realtime_date
小于或等于aDate
?
感谢
的一种方法是通过在CPIobvs['observations']['observation']
其中'realtime_start'
>
aDate
过滤掉所有的项目,以确定候选人。
我会做这个作为generator expression:
candidates = (ob for ob in CPIobvs['observations']['observation'] if
ob['realtime_start'] <= aDate)
如果你想看到的细节,你可以形成你解释一个list comprehension:
[ob for ob in CPIobvs['observations']['observation'] if
ob['realtime_start'] <= aDate]
一旦这些候选人确定后,随后,使用内置的max()
函数,为key
提供一个lambda,其使用'realtime_start'
的值对候选人进行排序dict
s:
last_ob = max(candidates, key=lambda ob: ob['realtime_start'])
您需要的细节现在在last_ob['date']
和last_ob['value']
。
+1,谢谢。我不完全明白发生了什么事:我检查了候选对象的类型,它是一个“生成器” - 不完全确定它是什么。我要问的原因是列表obsList = CPIobvs ['observations'] ['observation']'中的每个元素都是以下形式的'dict':'{'date':'2013-01-01', 'realtime_end':'9999-12-31','realtime_start':'2013-02-21','value':'231.198'}'。我的目标是打印'obsList ['date'],obsList ['value']'对,并且受到与该日期关联的最大'obsList ['realtime_start']'日期的约束。 – ricardo 2013-03-02 05:27:38
我意识到我的评论真的是另一个[问题](http://*.com/questions/15180767/subset-list-based-on-value-of-dictionary-element),所以我接受并张贴了另一个。谢谢 – ricardo 2013-03-02 23:47:58
@ricardo:我希望我的最新答案能够澄清细节。 – Johnsyweb 2013-03-03 07:47:31
可能我建议你做的任何事情都有''obs = CPIobvs ['observations'] ['observation']''for for循环外部;以节省可能的拼写错误和可读性。 – sotapme 2013-02-24 11:31:41
+1谢谢。一个有用的提示。 – ricardo 2013-03-02 05:17:26