2015-07-20 141 views
1

我有一个字典,它包含一个小时的日期时间戳记(自纪元以来的秒数),因为它们是关键字,而一个整数作为每个的值。目前,我有不完整的每小时日期时间系列,我想填补任何空白。有没有办法“填写”一系列日期时间戳?

我的意思是,如果我有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.显然不是优雅的...

+3

请用简短的代码演示您的问题,以便他人直接查看问题。 – BartoszKP

+0

当你说“datetime”你实际上使用'datetime'模块,还是那些只是字符串或其他? – Vorticity

+0

我将包含一段代码来显示我的问题,但是,我正在使用datetime。 – Mirza

回答

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 
+0

你永远不会通过'step'增加。我很困惑。 –

+0

对于我来说,在没有数据的情况下填补空缺是非常重要的。 – Mirza

+0

我认为这是最好的想法,尽管我会重新组织一下(不要改变'start',做一个新变量'now',我们正在逐步完成。不要做'timedelta(seconds = 3600) ',做'timedelta(小时= 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 

这可能是值得注意你可以将任何字典转换为FilledDict:

In [10]: d = dict(a=1, b=2) 

In [11]: fd = FilledDict(d) 

In [12]: fd 
Out[12]: {'a': 1, 'b': 2} 
+1

非常有创造力! TIL关于魔法'__missing__'方法 –

相关问题