繁体   English   中英

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

[英]How do I easily manipulate a timestamp key in a Python dictionary?

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

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

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

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

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

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

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

首先,我建议使用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)))

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM