【问题标题】:how to filter data from url using python on the basis of current date如何根据当前日期使用python过滤来自url的数据
【发布时间】:2021-05-07 11:07:59
【问题描述】:

我的问题是如何在两个条件下提取数据,

  1. 今天的日期,
  2. 最低年龄限制应为 45 岁及以上

谁能帮我解决这个问题:如何从给定的 JSON 文本中过滤数据?

我现在从代码中得到了输出,我想找出在今天日期超过 45 岁及以上年龄限制的可用中心。我需要显示该中心的全部数据


    url = 'myurl'
    response = urllib.request.urlopen(url)
    data = json.loads(response.read())
    json_formatted_str = json.dumps(data, indent=2, )

输出:


    {
      "centers": [
        {
          "center_id": 55,
          "name": "abc Hospital GH",
          "sessions": [
            {
              "session_id": "1a",
              "date": "06-05-2021",
              "available_capacity": 0,
              "min_age_limit": 45,
           
              "slots": [
                "09:00AM-11:00AM",
                "11:00AM-01:00PM",
                "01:00PM-03:00PM",
                "03:00PM-06:00PM"
              ]
            },
            {
              "session_id": "2a",
              "date": "07-05-2021",
              "available_capacity": 0,
              "min_age_limit": 45,
            }
          ]
        },
        {
          "center_id": 638690,
          "name": "xyz Hospital",
          "sessions": [
            {
              "session_id": "2a",
              "date": "06-05-2021",
              "available_capacity": 0,
              "min_age_limit": 45,
            }
          ]
        },
    ]
    }

【问题讨论】:

  • 所以date 键应该是今天的日期还是今天之前的任何日期?
  • 我想查看的不仅仅是当前的可用性,只有今天的日期
  • 那么对于这个字典,输出应该是第一家医院?
  • 如何将过滤器放在给定的输出上。有很多医院。但我在这里只发布了两个。并且数据是动态的。所以进行日常分析。代码是什么
  • 只需遍历数组,将它们保存在新数组中。见this

标签: python json python-3.x filter


【解决方案1】:

接受的答案也将返回不满足您条件的会话。

这是一种省略不匹配会话的方法。

def center_check(center):
    center['sessions'] = [sess for sess in center['sessions'] if session_check(sess)]
    if center['sessions']:
        return True
    return False

def session_check(session):
    from datetime import date
    today = date.today().strftime("%d-%m-%Y")
    if session['date'] == today and session['min_age_limit'] >= 45:
        return True
    return False

[cent for cent in data['centers'] if center_check(cent)]

【讨论】:

  • 哪些会话不满足条件,我的答案会返回吗?
  • @Sid 你的out_lst 包含 2 个sessions,应该只返回 1 个。日期是 5 月 6 日和 7 日,只有其中一个日期应该匹配
  • @yog 我已经更新了我的答案,我原以为你想要医院词典。
  • sid,确切地说,我想要整个医院词典,但是当同一家医院包含 2 个会话时,只显示今天的会话。而不是以前的
  • 嘿,谢谢ranvit,你的代码给出了准确的解决方案。谢谢你帮助我。
【解决方案2】:

为了根据您的需要比较数据,您需要提取日期和 最低年龄限制。 最低年龄限制:

minimun_age_limit = json_formatted_str["centers"][1]["min_age_limit"]

日期:

today = date.today()
d1 = today.strftime("%d-%m-%Y")
date_from_response = json_formatted_str["centers"][1]["date"]

if date_from_response.startswith(d1) and minimum_age_limit > 45:
   do your stuff here

【讨论】:

    【解决方案3】:

    遍历医院字典:

    from datetime import date
    today = date.today().strftime("%d-%m-%Y")
    out_lst = []
    for x in a['centers']:
        for session in x['sessions']:
            if session['date'] == today and session['min_age_limit'] == 45:
                out_lst.append(x)
                print(x['center_id']); break
    print(out_lst)
    

    此处out_lst 将列出所有符合条件的医院词典。

    如果您只想要相关会话,请编辑:

    today = date.today().strftime("%d-%m-%Y")
    out_lst = []
    for x in a['centers']:
      for session in x['sessions']:
        if session['date'] == today and session['min_age_limit'] == 45:
          out_lst.append(session)
          print(x['center_id']); break
    print(out_lst)
    

    【讨论】:

    • 嗨,西德。我想要整个医院词典,但是当同一家医院包含 2 个会话时,只显示今天的会话。并省略另一个会话
    【解决方案4】:

    使用 filter() 的另一种解决方案:

    import json
    from datetime import date
    ...
    def condition(hospital):
        today = date.today().strftime("%d-%m-%Y")
        for session in hospital["sessions"]:
            if (session["date"] == today) and (session["min_age_limit"] >= 45):
                return True
        return False
    
    
    filtered = filter(condition, data["centers"])
    print(json.dumps(list(filtered)))
    

    编辑:

    如果你想省略其他会话,你可以升级条件方法如下:

    def condition(hospital):
        today = date.today().strftime("%d-%m-%Y")
        is_actual = False
        to_delete = []
        for session in hospital["sessions"]:
            if (session["date"] == today) and (session["min_age_limit"] >= 45):
                is_actual = True
            else:
                to_delete.append(session)
                
        for session in to_delete:
            hospital["sessions"].remove(session)
                
        return is_actual
    

    这可能有点令人困惑,因为过滤器方法实际上是在编辑对象。

    【讨论】:

    • 谢谢 Levente Simofi,它正在工作,但我想通过保留医院数据省略今天会议以外的会议
    • 好的,我明白了,我还编辑了我的答案以适应问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2018-09-06
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多