具有以下词典列表,其中包括时间戳记(以字符串值形式)和一个值:
my_example = [{'timestamp': '2009-11-10T23:00:01Z', 'value': 1},
{'timestamp': '2009-11-10T23:00:05Z', 'value': 2},
{'timestamp': '2009-11-10T23:00:20Z', 'value': 3}]
我想要给定的时间戳记值(以字符串格式),找到(最接近的)最小值。我的解释有点混乱,因此最好在示例中查看:
2009-11-10T23:00:019Z
,我想返回:{'timestamp': '2009-11-10T23:00:05Z', 'value': 2}
(而不是{'timestamp': '2009-11-10T23:00:20Z', 'value': 3}
)。2009-11-10T23:00:04Z
,我想返回:{'timestamp': '2009-11-10T23:00:01Z', 'value': 1}
(而不是{'timestamp': '2009-11-10T23:00:05Z', 'value': 2}
)。2009-11-10T23:00:05Z
,我想返回:{'timestamp': '2009-11-10T23:00:05Z', 'value': 2}
。下面的代码获取最接近的值,但是我不知道如何修改它以获取最小值。
import datetime
my_example = [{'timestamp': '2009-11-10T23:00:01Z', 'value': 1}, {'timestamp': '2009-11-10T23:00:05Z', 'value': 2}, {'timestamp': '2009-11-10T23:00:20Z', 'value': 3}]
myNumber = "2009-11-10T23:00:19Z"
myNumber = datetime.datetime.strptime(myNumber, "%Y-%m-%dT%H:%M:%SZ")
res = min(my_example, key=lambda x:abs(datetime.datetime.strptime(x["timestamp"], "%Y-%m-%dT%H:%M:%SZ") - myNumber))
print(res)
谢谢。
答案 0 :(得分:0)
您可以转换为元组,将未来的日期替换为无穷大,然后取最小值。
您的数据:
import datetime
my_example = [{'timestamp': '2009-11-10T23:00:01Z', 'value': 1}, {'timestamp': '2009-11-10T23:00:05Z', 'value': 2}, {'timestamp': '2009-11-10T23:00:20Z', 'value': 3}]
myNumber = "2009-11-10T23:00:19Z"
myNumber = datetime.datetime.strptime(myNumber, "%Y-%m-%dT%H:%M:%SZ")
res = min(my_example, key=lambda x:abs(datetime.datetime.strptime(x["timestamp"], "%Y-%m-%dT%H:%M:%SZ") - myNumber))
print(res)
编辑:我将其从熊猫更改为日期时间,并添加了元组。在这里,我们采用列表的日期和第二个元组。我们在这里进行了一些笨拙的操作,将将来的所有内容都更改为无穷大,因此我们将其跳过。然后,我们只取最小的元组列表,它应该返回最近的时间,而不是将来的时间。
def get_min_time(myNumber, list_):
myNumber = datetime.datetime.strptime(myNumber, "%Y-%m-%dT%H:%M:%SZ")
times = [(myNumber - datetime.datetime.strptime(x["timestamp"], "%Y-%m-%dT%H:%M:%SZ")) for x in list_]
tups = [(x.days, x.seconds) for x in times]
tups = [(float("inf"), float("inf")) if time < (0, 0) else time for time in tups]
return list_[tups.index(min(tups))]
get_min_time("2009-11-10T23:00:19Z", my_example)
{'timestamp': '2009-11-10T23:00:05Z', 'value': 2}
get_min_time("2009-11-10T23:00:04Z", my_example)
{'timestamp': '2009-11-10T23:00:01Z', 'value': 1}
get_min_time("2009-11-10T23:00:05Z", my_example)
{'timestamp': '2009-11-10T23:00:05Z', 'value': 2}
如果您需要针对整个列表运行此命令,请使用列表理解:
[get_min_time(x, list_) for x in my_Numbers]