如何根据日期时间值获取最近的json对象?

时间:2015-07-28 05:42:04

标签: python json datetime

假设我有json数据,其中每条记录中的唯一值是datetime。我如何获得最新版本?

示例Json:

pathVariable

有什么方法可以比较这个日期时间和python中的系统日期时间,找出哪个是最近的记录并仅返回该记录?我不想根据这里的id返回。如果两个日期时间完全相同,我想返回这两个最近的记录。到目前为止,我能够按升序时间顺序对JSON数据进行排序。但我相信这种方法是不正确的,因为JSON总是无序的。有没有其他办法呢?或者我可以返回排序数据中的最后一条记录吗?

如果日期时间格式在{ "jobs": [ { id: 1, startTime: Wed 15 Jul 2015 15:39:33 GMT, somekey: someval, somekey: someval }, { id:1, startTime: Sat 25 Jul 2015 02:37:50 GMT, somekey: someval, somekey: someval } ] } 中,则可以使用%y-%m-%d对其进行排序。但是,如果时间格式是给定的,我无法弄清楚如何获取最新的一个。

2 个答案:

答案 0 :(得分:1)

使用key属性对日期进行排序是一个好主意。

我做了同样的事情,但使用max()以获取最新数据,然后返回具有相同日期的所有数据。

from datetime import datetime 

def most_recent(data):
    dates = data["jobs"]
    recent = max(dates, key=lambda x: datetime.strptime(x["startTime"], '%a %d %b %Y %X GMT'))["startTime"]
    return [d for d in dates if d["startTime"] == recent]

您误解的是,您确实无法对词典进行排序,但您可以对包含类词典对象的列表进行排序。

如果仔细观察,您的JSON数据就是字典列表,因此可以轻松地将其排序为任何其他列表对象。

答案 1 :(得分:0)

首先,对于'Sat 25 Jul 2015 02:37:50 GMT'格式的日期,您可以使用以下格式字符串来使用strptime()解析日期时间 -

%a %d %b %Y %H:%M:%S %Z

演示 -

>>> datetime.datetime.strptime('Wed 15 Jul 2015 15:39:33 GMT','%a %d %b %Y %H:%M:%S %Z')
datetime.datetime(2015, 7, 15, 15, 39, 33)

其次,似乎json字典的jobs键的元素有一个列表,列表有一个顺序,你可以对该列表进行排序(也许使用sorted()函数,也就是说更容易按相反的顺序排序,因此它不会排序)然后你可以使用 -

datetime.datetime.now()

要获取当前时间,然后遍历列表,您可以检查小于now()的第一个日期(因为列表按降序排序),然后继续迭代并取数据,直到您找到低于它的日期。这是假设您将来也可以有日期。

示例 -

import datetime
def get_most_recent(data):
    lst = data[jobs]
    newlst = sorted(lst,key=lambda x:datetime.datetime.strptime(x['startTime'],'%a %d %b %Y %H:%M:%S %Z'),reverse=True)
    recentdate = None
    nowd = datetime.datetime.now()
    retlist = []
    for i in newlst:
        d = datetime.datetime.strptime(i['startTime'],'%a %d %b %Y %H:%M:%S %Z')
        if recentdate is not None:
             if d == recentdate:
                 retlist.append(i)
             else:
                 break;
        elif d < nowd:
            recentdate = d
            retlist.append(i)
    return retlist