如果键与第一个键的差异不超过 x 天,则在 python 中过滤有序字典中的键值对
Filter key-value pairs in an ordered dictionary in python if keys differ from the first key by no more than x days
我在 python 中有一个有序字典,其中键的格式为日期时间,值是项目列表。我希望能够通过键和第一个键之间的差异来过滤这本字典中的键值对。例如,我只想保留在第一个键值对发生后 5 天内发生的那些键值对。换句话说,如果从另一个键值中减去第一个键值,则相差不超过 5 天。
我知道我可以通过一个简单的条件来过滤字典,就像这里所做的那样:
How to filter a dictionary according to an arbitrary condition function?
但我不确定如何在我的案例中设置条件,因为我需要对字典中的第一个键和相对于每个其他键的绝对引用。
我要过滤的词典如下所示:
my_dict = OrderedDict([
(Timestamp('2019-01-11 00:00:00'), ['a','b','c']),
(Timestamp('2019-01-16 00:00:00'),['c', 'e', 'f', 'k']),
(Timestamp('2019-01-23 00:00:00'), ['a', 'c', 'l']),
(Timestamp('2019-02-08 00:00:00'), ['w','y','z'])
])
我过滤的字典应该只包含从第一个键起 5 天内有键的键值对,所以我最终应该只有前两个键值对。
filt_dict = OrderedDict([
(Timestamp('2019-01-11 00:00:00'), ['a','b','c']),
(Timestamp('2019-01-16 00:00:00'),['c', 'e', 'f', 'k']),
])
我不确定你的 class Timestamp
里面有什么,所以我做了一些让你入门的东西:
from collections import OrderedDict
from datetime import datetime, timedelta
class Timestamp:
def __init__(self, t):
t = datetime.strptime(t, "%Y-%m-%d %H:%M:%S")
self.t = datetime(year=t.year, month=t.month, day=t.day, hour=t.hour, minute=t.minute, second=t.second)
def __lt__(self, other):
return self.t < other.t
def __sub__(self, other):
return self.t - other.t
def __repr__(self):
return '{}'.format(self.t)
my_dict = OrderedDict([
(Timestamp('2019-01-11 00:00:00'), ['a','b','c']),
(Timestamp('2019-01-16 00:00:00'),['c', 'e', 'f', 'k']),
(Timestamp('2019-01-23 00:00:00'), ['a', 'c', 'l']),
(Timestamp('2019-02-08 00:00:00'), ['w','y','z'])
])
first = [*my_dict.keys()][0]
d = timedelta(days=5)
new_dict = OrderedDict( (k, v) for k, v in my_dict.items() if k - first <= d )
print(new_dict)
打印:
OrderedDict([(2019-01-11 00:00:00, ['a', 'b', 'c']), (2019-01-16 00:00:00, ['c', 'e', 'f', 'k'])])
我在 python 中有一个有序字典,其中键的格式为日期时间,值是项目列表。我希望能够通过键和第一个键之间的差异来过滤这本字典中的键值对。例如,我只想保留在第一个键值对发生后 5 天内发生的那些键值对。换句话说,如果从另一个键值中减去第一个键值,则相差不超过 5 天。
我知道我可以通过一个简单的条件来过滤字典,就像这里所做的那样:
How to filter a dictionary according to an arbitrary condition function?
但我不确定如何在我的案例中设置条件,因为我需要对字典中的第一个键和相对于每个其他键的绝对引用。
我要过滤的词典如下所示:
my_dict = OrderedDict([
(Timestamp('2019-01-11 00:00:00'), ['a','b','c']),
(Timestamp('2019-01-16 00:00:00'),['c', 'e', 'f', 'k']),
(Timestamp('2019-01-23 00:00:00'), ['a', 'c', 'l']),
(Timestamp('2019-02-08 00:00:00'), ['w','y','z'])
])
我过滤的字典应该只包含从第一个键起 5 天内有键的键值对,所以我最终应该只有前两个键值对。
filt_dict = OrderedDict([
(Timestamp('2019-01-11 00:00:00'), ['a','b','c']),
(Timestamp('2019-01-16 00:00:00'),['c', 'e', 'f', 'k']),
])
我不确定你的 class Timestamp
里面有什么,所以我做了一些让你入门的东西:
from collections import OrderedDict
from datetime import datetime, timedelta
class Timestamp:
def __init__(self, t):
t = datetime.strptime(t, "%Y-%m-%d %H:%M:%S")
self.t = datetime(year=t.year, month=t.month, day=t.day, hour=t.hour, minute=t.minute, second=t.second)
def __lt__(self, other):
return self.t < other.t
def __sub__(self, other):
return self.t - other.t
def __repr__(self):
return '{}'.format(self.t)
my_dict = OrderedDict([
(Timestamp('2019-01-11 00:00:00'), ['a','b','c']),
(Timestamp('2019-01-16 00:00:00'),['c', 'e', 'f', 'k']),
(Timestamp('2019-01-23 00:00:00'), ['a', 'c', 'l']),
(Timestamp('2019-02-08 00:00:00'), ['w','y','z'])
])
first = [*my_dict.keys()][0]
d = timedelta(days=5)
new_dict = OrderedDict( (k, v) for k, v in my_dict.items() if k - first <= d )
print(new_dict)
打印:
OrderedDict([(2019-01-11 00:00:00, ['a', 'b', 'c']), (2019-01-16 00:00:00, ['c', 'e', 'f', 'k'])])