我开发了以下代码来从Web API中提取数据,我试图根据以下条件对其进行操作:计算用户在日期初始日期(当前时间)之间出现的次数 - 6天和最终日期是当前时间。
我收到的JSON对象具有以下结构:
[{
id: 1003384,
user_id : 0001
CreatedOn: "2017-02-16 15:54:48",
Problem: "AVAILABILILTY",
VIP: "YES",
Vendor_CODE: "XYZ12345",
Week_id: "07",
},
{
id: 1003338,
user_id: 0002
CreatedOn: "2017-02-15 13:49:16",
Problem: "AVAILABILILTY",
VIP: "NO",
Vendor_CODE: "XYZ67890",
Week_id: "09",
},
{
id: 1553338,
user_id: 0002
CreatedOn: "2017-03-15 09:30:36",
Problem: "AVAILABILILTY",
VIP: "YES",
Vendor_CODE: "ACE67890",
Week_id: "13",
}]
现在,当我执行以下代码时,我无法计算用户在给定的两个日期之间出现的次数,因为我得到的错误键应该是整数而不是字符串,我不知道应该在哪里实现初始和最终日期
from datetime import datetime, timedelta
from rest_framework.response import Response
import json, urllib.request
from collections import Counter
#Request a response to the Web API
def get_data(request, *args, **kwargs):
# YYYY-MM-DD
start_date = datetime.now() - timedelta(days=7)
end_date = datetime.now() - timedelta(days=1)
with urllib.request.urlopen("http://10.61.202.98:8081/T/ansdb/api/rows/triage/ect/tickets",timeout=15) as url:
response_data = json.loads(url.read().decode())
#verify that you receive data in your terminal
print(response_data[0])
# The JSON object should be manipulated as a dictionary but this is not the case
user_times = Counter(k['user_id'] for k in response_data if k.get('user_id'))
return JsonResponse(response_data, safe=False)
为了避免错误键应该是整数而不是字符串我使用print(response_data [0])来获取输出:
{
id: 1003384,
user_id : 0001
CreatedOn: "2017-02-16 15:54:48",
Problem: "AVAILABILILTY",
VIP: "YES",
Vendor_CODE: "XYZ12345",
Week_id: "07",
}
我的问题是:
一旦用json.loads(url.read()。decode())解析它,我的JSON数据是否为字典?如果是这样,为什么我无法将数据检索为response_data [' user_id']以查看所有用户?
代码中缺少什么来计算用户出现以便工作的次数?
在此先感谢,请随时向此帖提出任何建议。
更新 2017年6月6日
我解析的JSON数据是一个字典,我可以验证它,因为我使用了print(isinstance(response_data [0],dict)),结果为True。
我尝试使用print(response_data.keys())打印此字典中的键,但是我遇到了这个错误:list对象没有属性' keys'。如果Python声明这是一个字典但我无法打印密钥,这怎么可能?
答案 0 :(得分:1)
首先:您无法response_data['user_id']
,因为response_data
是一个列表。所以,你必须做response_data[0]['user_id']
。
第二:您的代码应该在列表理解中:
Counter([k['user_id'] for k in response_data if k.get('user_id')])
第三次:您应该在列表理解中实现它,如下所示:
Counter([k['user_id'] for k in response_data if k.get('user_id') and start_date < dateutil.parser.parse(k.get('CreatedOn')) < end_date])
你应该为第三个人安装dateutil。或者使用任何其他方式将字符串转换为日期时间。
希望它有所帮助!