我有一个字典,它包含一个每小时的日期时间戳(自纪元以来的秒数),因为它们是键,一个整数作为每个的值。目前,我有一个不完整的每小时日期系列,我想填补任何空白。
我的意思是,如果我有一个5/15/2015 17:00:00的条目和5/15/2015 19:00:00的条目,但2015年5月15日18:00没有:00,有没有办法快速迭代并填充那些丢失的每小时键,其值为“0”。
我有大量原始文本数据,其中包含以下格式的日期:YYYY-mm-DD HH:MM:SS,我将其舍入到小时(通过使用datetime.datetime.strptime转换为自纪元以来的秒数,并截断分钟和秒数,并基本上计算每小时在原始数据中显示的次数。所以我的字典看起来像{'2015-04-02 04:00:00':1,'2015-06-06 13:00:00':4,...}。有小时差距,我想快速有效地填补它们。
我目前的解决方案是找到字典键的最小值,并创建一个全新的字典并填写每小时,直到原始字典的最大值。那么我只是重做我写的代码来创建原始字典,它改变了要更改数据的值,但是将“空”值保留为0.显然不优雅......
答案 0 :(得分:4)
解决方案可能是:
import datetime
# your dictionnary
data = {...}
start = datetime.datetime.fromtimestamp(0)
step = datetime.timedelta(seconds=3600)
stop = datetime.datetime.now()
while start <= stop:
key = start.strftime('%d/%m/%Y %H:%M:%S')
if key not in data:
data[key] = 0
start+= step
但是,填补空白是否值得?或者你的用例是collections.defaultdict
?
示例:
>>> data = collections.defaultdict(int)
>>> print data['5/15/2015 17:00:00']
0
答案 1 :(得分:3)
您可以通过以下方式扩展dict
类:
class FilledDict(dict):
def __missing__(self, i):
if any(k < i for k in self.keys()) and any(k > i for k in self.keys()):
return 0
raise KeyError()
然后像任何字典一样使用它:
In [2]: fd = FilledDict()
In [3]: fd[2] = 3
In [4]: fd[4] = 5
In [5]: fd[1]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-5-e8f6ba432654> in <module>()
----> 1 fd[1]
/tmp/ipython_edit_lfgvSO/ipython_edit_OrM6Oj.py in __missing__(self, i)
4 if any(k < i for k in self.keys()) and any(k > i for k in self.keys()):
5 return 0
----> 6 raise KeyError()
KeyError:
In [6]: fd[3]
Out[6]: 0
值得注意的是,您可以将任何dict转换为FilledDict:
In [10]: d = dict(a=1, b=2)
In [11]: fd = FilledDict(d)
In [12]: fd
Out[12]: {'a': 1, 'b': 2}