Python 通过循环使用公共ID查找json文件的最早日期
我是python新手,一直在家里尝试一些项目。我从api中提取了json数据,并将其格式化为我想要的数据,但我需要删除具有最早日期的重复(id)记录 我的json如下所示:Python 通过循环使用公共ID查找json文件的最早日期,python,json,python-3.x,Python,Json,Python 3.x,我是python新手,一直在家里尝试一些项目。我从api中提取了json数据,并将其格式化为我想要的数据,但我需要删除具有最早日期的重复(id)记录 我的json如下所示: [ { "id": 1, "date": "2019-06-20T10:39:03.915Z", "name": "xxx" }, { "id": 1, "date": "2019-06-20T07:50:53.533Z", "name": "xxx" },
[
{
"id": 1,
"date": "2019-06-20T10:39:03.915Z",
"name": "xxx"
},
{
"id": 1,
"date": "2019-06-20T07:50:53.533Z",
"name": "xxx"
},
{
"id": 2,
"date": "2019-06-19T10:55:21.741Z",
"name": "xxx"
},
]
我尝试过使用(数据是我的json文件):
我希望在new.json中获得以下输出,但是日期似乎是空的:
[
{
"id": 1,
"date": "2019-06-20T07:50:53.533Z",
"name": "xxx"
},
{
"id": 2,
"date": "2019-06-19T10:55:21.741Z",
"name": "xxx"
},
]
我的代码在某些人看来可能很糟糕,但请原谅,因为我没有用python编写很长时间的代码。我找过类似的话题,但什么也没找到。任何帮助都很好。您可以使用模块格式化数据。这可能是将
列表从最旧记录排序到最新记录的关键:
导入日期时间
数据=[{
“id”:1,
“日期”:“2019-06-20T10:39:03.915Z”,
“名称”:“xxx”
},
{
“id”:1,
“日期”:“2019-06-20T07:50:53.533Z”,
“名称”:“xxx”
},
{
“id”:2,
“日期”:“2019-06-19T10:55:21.741Z”,
“名称”:“xxx”
}]
已排序(数据,key=lambda x:datetime.datetime.strtime(x['date'],'%Y-%m-%dT%H:%m:%S.%fZ'))
[{'id':2,'date':'2019-06-19T10:55:21.741Z','name':'xxx'},
{'id':1,'date':'2019-06-20T07:50:53.533Z','name':'xxx'},
{'id':1,'date':'2019-06-20T10:39:03.915Z,'name':'xxx'}]
如果您首先想要最新的记录,只需将reverse
关键字传递给排序的:
sorted(数据,key=lambda x:datetime.datetime.strtime(x['date'],“%Y-%m-%dT%H:%m:%S.%fZ”),reverse=True)
[{'id':1,'date':'2019-06-20T10:39:03.915Z','name':'xxx'},
{'id':1,'date':'2019-06-20T07:50:53.533Z','name':'xxx'},
{'id':2,'date':'2019-06-19T10:55:21.741Z','name':'xxx'}
现在,您可以按id
对结果进行分组,并使用上面的内容获取最早的记录:
#我们将在这里使用defaultdict,因为它会导致这种分组问题
从集合导入defaultdict
d=默认DICT(列表)
对于数据中的项目:
d[item['id']]。追加(item)#创建按id分组的列表
#d现在看起来像
#{1:[{'id':1,'date':'2019-06-20T10:39:03.915Z','name':'xxx'},
#{'id':1,'date':'2019-06-20T07:50:53.533Z','name':'xxx'},
#2:[{'id':2,'date':'2019-06-19T10:55:21.741Z','name':'xxx'}]}
#现在,排序并使用'pop'来获取最古老的,因为它是反向的
#选项将最新日期放在第一位,最旧日期放在最后
对于d.项()中的k,v:
#v将是列表,使用上述方法对其进行排序,
#和pop()将返回列表的最后一个元素
v=已排序(v,key=lambda x:datetime.datetime.strtime(x['date'],“%Y-%m-%dT%H:%m:%S.%fZ'),reverse=True)。pop()
d[k]=v
列表(d.values())
[{'id':1,'日期':'2019-06-20T07:50:53.533Z','name':'xxx'},{'id':2,'日期':'2019-06-19T10:55:21.741Z','name':'xxx'}]
您可以使用模块格式化数据。这是您将列表从最旧记录排序到最新记录的关键:
导入日期时间
数据=[{
“id”:1,
“日期”:“2019-06-20T10:39:03.915Z”,
“名称”:“xxx”
},
{
“id”:1,
“日期”:“2019-06-20T07:50:53.533Z”,
“名称”:“xxx”
},
{
“id”:2,
“日期”:“2019-06-19T10:55:21.741Z”,
“名称”:“xxx”
}]
已排序(数据,key=lambda x:datetime.datetime.strtime(x['date'],'%Y-%m-%dT%H:%m:%S.%fZ'))
[{'id':2,'date':'2019-06-19T10:55:21.741Z','name':'xxx'},
{'id':1,'date':'2019-06-20T07:50:53.533Z','name':'xxx'},
{'id':1,'date':'2019-06-20T10:39:03.915Z,'name':'xxx'}]
如果您首先想要最新的记录,只需将reverse
关键字传递给排序的:
sorted(数据,key=lambda x:datetime.datetime.strtime(x['date'],“%Y-%m-%dT%H:%m:%S.%fZ”),reverse=True)
[{'id':1,'date':'2019-06-20T10:39:03.915Z','name':'xxx'},
{'id':1,'date':'2019-06-20T07:50:53.533Z','name':'xxx'},
{'id':2,'date':'2019-06-19T10:55:21.741Z','name':'xxx'}
现在,您可以按id
对结果进行分组,并使用上面的内容获取最早的记录:
#我们将在这里使用defaultdict,因为它会导致这种分组问题
从集合导入defaultdict
d=默认DICT(列表)
对于数据中的项目:
d[item['id']]。追加(item)#创建按id分组的列表
#d现在看起来像
#{1:[{'id':1,'date':'2019-06-20T10:39:03.915Z','name':'xxx'},
#{'id':1,'date':'2019-06-20T07:50:53.533Z','name':'xxx'},
#2:[{'id':2,'date':'2019-06-19T10:55:21.741Z','name':'xxx'}]}
#现在,排序并使用'pop'来获取最古老的,因为它是反向的
#选项将最新日期放在第一位,最旧日期放在最后
对于d.项()中的k,v:
#v将是列表,使用上述方法对其进行排序,
#和pop()将返回列表的最后一个元素
v=已排序(v,key=lambda x:datetime.datetime.strtime(x['date'],“%Y-%m-%dT%H:%m:%S.%fZ'),reverse=True)。pop()
d[k]=v
列表(d.values())
[{'id':1,'日期':'2019-06-20T07:50:53.533Z','name':'xxx'},{'id':2,'日期':'2019-06-19T10:55:21.741Z','name':'xxx'}]
根据,您拥有的json数据不是有效的json格式。数据
a字典
元素的列表
?查看datetime.strtime(…)
根据,您拥有的json数据不是有效的json格式。数据
a字典
元素的列表
?查看datetime.strtime(…)
谢谢C.Nivs我会试试的。我正试图为每个唯一的IDThank@C.Nivs创建一个新的列表,其中只包含最早的日期。这非常有效。非常感谢您的回复(现在进行研究并真正理解).再次感谢!!!感谢C.Nivs我会尝试一下。我试图为每个唯一的IDThank@C.Nivs创建一个新列表,其中只包含最早的日期。这非常有效。非常感谢回复(现在进行研究并真正理解)。再次感谢!!!
[
{
"id": 1,
"date": "2019-06-20T07:50:53.533Z",
"name": "xxx"
},
{
"id": 2,
"date": "2019-06-19T10:55:21.741Z",
"name": "xxx"
},
]