Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过循环使用公共ID查找json文件的最早日期_Python_Json_Python 3.x - Fatal编程技术网

Python 通过循环使用公共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" },

我是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": 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"
  },
]