按日期排除对象

时间:2019-07-08 21:22:14

标签: python

我有一个包含多个对象和数组(包括日期)的JSON文件。而且我想选择一个对象的关键值日期是在2019年之前。

for b in data:
    results = b['results']

    for a in results:
        if not results == []:
            date_pyt = a["auction_datetime"]
            date_datetime = datetime.strptime(date_pyt, "%Y-%m-%d").date()
            maxdate = datetime(2018, 12, 31).date()

            prices = [a["price_int_eu"] for a in results if maxdate >= date_datetime]
            prices = [a for a in prices if a is not None]

     print(prices)

我的输入:

{("id": 1,
 "results": []},
{"id": 2,
"results": [
            {
                "auction_datetime": "2019-06-15",
                "price_int_eu": 13325
            },
            {
                "auction_datetime": "2018-08-25",
                "price_int_eu": 5523
            },
            {
                "auction_datetime": "2017-04-29",
                "price_int_eu": 8309
            },
            {
                "auction_datetime": "2016-10-20",
                "price_int_eu": null
            }
        ]}

输出: [13325, 5523, 8309] 从理论上讲,13325不会被打印。

2 个答案:

答案 0 :(得分:4)

您要从results中的一个元素中获取日期,然后过滤该日期的所有结果。因此,如果当前项目日期合适(在2019年之前),则将选择所有元素,对于下一个元素,您将再次执行相同的测试。每次使用prices中当前元素的结果重新创建a列表时,最后都只保留最后一个结果。

您需要使用一个循环。要么使用列表推导,要么使用完整的for循环,而不要同时使用两者。

使用一个简单的循环:

maxdate = datetime(2018, 12, 31).date()
prices = []
for b in data:
    results = b['results']
    for a in results:
        date_pyt = a["auction_datetime"]
        date_datetime = datetime.strptime(date_pyt, "%Y-%m-%d").date()
        if date <= max_date and a["price_int_eu"] is not None:
            prices.append(a["price_int_eu"])

答案 1 :(得分:0)

您可以将每个结果的拍卖日期与2019年进行明确比较:

from datetime import date

def get_prices_before_year(data, year):
    prices_before_year= []

    for b in data:
        results = b["results"]
        for result in results:
            auction_date = date(*map(int, result["auction_datetime"].split("-")))
            if auction_date.year < year and result["price_int_eu"]:
                prices_before_year.append(result["price_int_eu"])

    return prices_before_year

def main():
    data = [
                {
                    "id": 1,
                    "results": []
                },
                {
                    "id": 2,
                    "results": [
                        {
                            "auction_datetime": "2019-06-15",
                            "price_int_eu": 13325
                        },
                        {
                            "auction_datetime": "2018-08-25",
                            "price_int_eu": 5523
                        },
                        {
                            "auction_datetime": "2017-04-29",
                            "price_int_eu": 8309
                        },
                        {
                            "auction_datetime": "2016-10-20",
                            "price_int_eu": None
                        }
                    ]
                }
            ]

    print(get_prices_before_year(data, 2019))

if __name__ == "__main__":
  main()

输出:

[5523, 8309]