如何在Python字典中轻松操作时间戳键?

时间:2011-01-08 19:07:41

标签: python dictionary time

我刚开始使用Python作为爱好,所以如果这是一个愚蠢的问题,请原谅我。

我最近在我的电脑上安装了一个功率计,我用它来跟踪它的功耗。它为我提供了导出到csv文件的实时分钟读数。

我已经解析并读取了文件,现在我有一个字典,其中键是时间戳,存储为时间库中的struct_time。目前,该词典具有每分钟读取的读数。我想创建一个新的字典,其键是小时时间戳,其值是各个分钟读数的总和。

我想过用一个计数器模式60循环字典,但我被告知这不是非常Pythonic。此外,无法保证每小时有60个读数。我该怎么做?

3 个答案:

答案 0 :(得分:9)

如果我对你的问题的理解是正确的,那就应该做好工作:

from collections import defaultdict
output = defaultdict(int)
for key, value in readings.iteritems():
    output[key.tm_hour] += value

使用defaultdict的好处是,它会通过将0作为值来处理丢失小时的情况。

修改

正如克里斯蒂安所指出的那样,OP可能会有几天的读数。在这种情况下,我遵循Adam Rosenfield首先介绍的建议,略作修改:

from collections import defaultdict
from datetime import datetime
output = defaultdict(int)
for key, value in readings.iteritems():
    output[datetime(*x[:4])] += value

这将构建日,月,年和小时的日期,而不是分钟或秒。

答案 1 :(得分:4)

首先,我建议使用datetime.datetime类而不是time.time_struct,因为后者实际上只是一个9元组的弱包装器,但前者是一个带有运算符的全功能类重载等。接下来,您可以使用collections.defaultdict轻松构建所需的总读数:

# power_reading is the data type corresponding to one set of power readings
# (it could be a simple float, or a tuple, or a class if you want; just make
# sure that you can add them together)
hourly_readings = collections.defaultdict(power_reading)
minutely_readings = { ... };  # dict of time.struct_time ==> power_reading

for timestamp, reading in minutely_readings.iteritems():
    hour = datetime.datetime(timestamp.tm_year, timestamp.tm_mon,
                             timestamp.tm_mday, timestamp.tm_hour);
    hourly_readings[hour] += reading

如果power_reading是元组,则不能使用+=(因为它连接了元组而不是进行元素添加),所以你必须做这样的事情而不是:

hourly_readings[hour] = tuple(map(sum, zip(hourly_readings[hour], reading)))

答案 2 :(得分:0)

Python3中的一行:

{time.struct_time(i+(0,0,0,0)):sum(k[1] for k in j) for i,j in itertools.groupby(sorted(D.items()),lambda x:x[0][:4])}

Python2:

result={}
tmp=(0,)*4
for i,j in itertools.groupby(sorted(D.items()),lambda x:x[0][:4]):
    result[time.struct_time(i+tmp)]=sum(k[1] for k in j)