python - 找到最接近给定时间戳的最小时间戳(从字典数组中)
问题描述
具有以下字典列表,其中包括时间戳(在字符串值中)和值:
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}]
我想要给定的时间戳值(字符串格式),找到(最接近的)最小值。我解释起来有点乱,所以最好看一个例子:
- 如果 given_timestamp 是
2009-11-10T23:00:019Z
我想返回:({'timestamp': '2009-11-10T23:00:05Z', 'value': 2}
而不是{'timestamp': '2009-11-10T23:00:20Z', 'value': 3}
)。 - 如果 given_timestamp 是
2009-11-10T23:00:04Z
我想返回:({'timestamp': '2009-11-10T23:00:01Z', 'value': 1}
而不是{'timestamp': '2009-11-10T23:00:05Z', 'value': 2}
)。 - 如果 given_timestamp 是
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)
提前致谢。
解决方案
您可以转换为元组,用无穷大替换未来的日期,然后取最小值。
您的数据:
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)
编辑:我将它从 pandas 更改为 datetime,并添加到元组中。在这里,我们取列表的日期和第二个元组。我们在这里做了一些巧妙的操作来改变未来的一切,所以我们跳过它。然后我们只取元组列表中的最小值,它应该返回不是未来的最接近的时间。
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]
推荐阅读
- flutter - 带有列和行的颤振座椅视图
- c# - Jenkins 构建失败并出现错误“未安装文件扩展名 '.tif' 的 IFilter”但在本地工作
- objective-c - 在目标c的tableview中加载时重复选择单元格
- python - 未安装来自自定义通道的 Conda 依赖项
- ios - 您可以从 PDF 数据创建 UIImage 吗?
- python - 无法在 python 中访问 args 值
- javascript - 在特定(空间)位置播放视频
- php - Laravel 计数不起作用,有什么支持吗?
- javascript - 如何使用 api 调用更新值?
- python - ARIMA模型python中错误日期的预测