首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中限制计数器集合

在Python中限制计数器集合
EN

Stack Overflow用户
提问于 2017-06-08 02:32:14
回答 1查看 38关注 0票数 0

我目前正在从web API中提取数据,并试图根据以下条件筛选一些值:计算用户在两个给定日期之间出现的次数,但前提是他/她购买了树莓pi、香蕉pi和树莓pi2而不是树莓pi3。

我收到的JSON对象具有以下结构:

代码语言:javascript
复制
[{
user_id : 0001
CreatedOn: "2017-02-16 15:54:48",
item: "raspbery pi",
VIP: "YES",
Vendor_CODE: "XYZ12345",
},
{
user_id : 0001
CreatedOn: "2017-02-15 13:49:16",
item: "raspbery pi2",
VIP: "YES",
Vendor_CODE: "XYZ67890",
},
{
user_id : 0001
CreatedOn: "2017-02-10 15:54:48",
item: "raspbery pi",
VIP: "YES",
Vendor_CODE: "RST171820",
},
{
user_id : 0001
CreatedOn: "2017-01-01 21:51:13",
item: "raspbery pi3",
VIP: "YES",
Vendor_CODE: "XOL002321",
},
{
user_id : 0005
CreatedOn: "2017-01-30 17:34:18",
item: "raspbery pi",
VIP: "YES",
Vendor_CODE: "RST171820",
},
{
user_id : 0005
CreatedOn: "2017-05-30 09:04:08",
item: "banana pi",
VIP: "YES",
Vendor_CODE: "ITI342027",
}]

目前,我有以下代码来计算用户在给定两个日期时出现的次数。

代码语言:javascript
复制
from django.shortcuts import render
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from collections import Counter
from datetime import datetime, timedelta
import json, urllib.request, dateutil.parser, urllib.parse,

#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/dev/ect",timeout=15) as url:
    response_data = json.loads(url.read().decode())

    #count the number of times the user appears when he bought the 4 items in two given dates
    count_user_01 = Counter([k['user_id'] for k in response_data if
         start_date_week < dateutil.parser.parse(k.get('CreatedOn')) < end_date_week])

我的方法是添加一些额外的“条件”来计算除树莓pi3项之外的所有项,如下所示:

代码语言:javascript
复制
count_user_01 = Counter([k['user_id'] for k in response_data if
     start_date_week < dateutil.parser.parse(k.get('CreatedOn')) < end_date_week] and k['item']!='raspberry pi3')

但是如果我这样做,我会遇到错误bool object is not iterable,我假设我收到了这个错误,因为集合计数器不允许我这样做。

我的问题是:

  1. 我如何在列表中实现这个额外的条件,以便我可以计算一个user?
  2. Currently,购买的除覆盆子pi3之外的所有商品我正在计算为特定用户购买的商品,但我如何计算所有用户购买的所有商品?

欢迎所有的评论,答案和建议。

更新

对于问题1,解决方案是在括号中解决问题。

代码语言:javascript
复制
count_user_01 = Counter([k['user_id'] for k in response_data if
 start_date_week < dateutil.parser.parse(k.get('CreatedOn')) < end_date_week and k['item']!='raspberry pi3'])
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44420293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档