我刚开始使用Python作为爱好,所以如果这是一个愚蠢的问题,请原谅我。
我最近在我的电脑上安装了一个功率计,我用它来跟踪它的功耗。它为我提供了导出到csv文件的实时分钟读数。
我已经解析并读取了文件,现在我有一个字典,其中键是时间戳,存储为时间库中的struct_time。目前,该词典具有每分钟读取的读数。我想创建一个新的字典,其键是小时时间戳,其值是各个分钟读数的总和。
我想过用一个计数器模式60循环字典,但我被告知这不是非常Pythonic。此外,无法保证每小时有60个读数。我该怎么做?
答案 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)